代码审计
PHP
前期准备
SQL注入篇
文件操作函数汇总
命令执行篇
XML实体注入篇
前端漏洞篇
反序列化篇
小技巧篇
其它资料
本文档使用 MrDoc 发布
-
+
首页
反序列化篇
# 反序列化篇 ## 序列化和反序列化介绍 - 什么是序列化?为什么几乎所有语言都有序列化功能? - 两台服务器上都运行PHP应用,我想讲服务器A上的一个PHP对象传到服务器B上,就需要使用序列化。 - 各种编程语言中的反序列化漏洞 - PHP反序列化漏洞 - Java反序列化漏洞 - Python反序列化漏洞 - 反序列化的分类 - 反序列化执行触发任意代码 -> Python - 反序列化后,通过已有代码利用链,间接执行任意代码 -> PHP/Java。这里是将一个对象通过一个自定义的规则生成字符串。 - 如何挖掘反序列化漏洞? - **php序列化代码** ``` <?php class Test{ public $name; function __construct($name) { $this->name = $name; } } $obj = new Test("测试"); echo serialize($obj); ?> // 输出 O:4:"Test":1:{s:4:"name";s:6:"测试";} ``` - **php 反序列化代码** ``` <?php class Test{ public $name; function __construct($name) { $this->name = $name; } } echo "<br>"; $data = 'O:4:"Test":1:{s:4:"name";s:6:"测试";}'; $obj1 = unserialize($data); var_dump($obj1); // 输出 object(Test)#2 (1) { ["name"]=> string(6) "测试" } ?> ``` - **PHP的一些类在做特殊动作的时候会执行一些特殊的函数**,举例如下: ```php <?php class Test{ public $name; function __construct($name) { $this->code="var_dump('123');"; // 正常情况下我们无法控制这个代码或者命令。 $this->name = $name; } function __toString() { return eval($this->code); // 这里调用执行了这个代码。 } function __destruct() { return eval($this->code); // 这个用的最多,在程序结束时的析构函数。 } } // $data = 'O:4:"Test":1:{s:4:"name";s:6:"测试";}'; //假设正常情况下我们传入的序列化内容是这样,只能控制$name // 我们可以通过序列化类的操作,自定义一个序列化的内容覆盖到$this->code中,进而造成代码执行。 $data = 'O:4:"Test":2:{s:4:"name";s:6:"测试";s:4:"code";s:10:"phpinfo();";}'; // 假设这个data就是我们传入的恶意序列化内容,这里就覆盖了code $obj1 = unserialize($data); echo $obj1; ?> ``` - 为了使用上面的这个反序列化,我们需要自己构造恶意的序列化内容,代码如下: ```php <?php class Test{ public $name; function __construct($name) { $this->code = 'phpinfo();'; $this->name = $name; } } $obj = new Test("测试"); echo serialize($obj); // 生成了一个序列化内容,O:4:"Test":2:{s:4:"name";s:6:"测试";s:4:"code";s:10:"phpinfo();";} ?> ``` ## 挖掘反序列化漏洞 - PHP (反)序列化函数 - serialize - unserialize - PHP 反序列化特点 - 引入除资源型外任意类型变量 - 无法引入函数->不能直接执行代码 - 迂回战术 - 寻找程序中可能存在漏洞的类 - 实例化对象->触发漏洞 - PHP反序列化后可能执行的方法 - __wakeup:反序列化操作执行后触发 - __destruct:类对象销毁时触发 - __toString:类对象转换为字符串时触发 - 漏洞挖掘过程 - 寻找调用反席列化函数的位置寻找包含危险方法的类 - 反序列化上下文是否包含该类 - 包含:直接生成该类,触发漏洞 - 不包含:寻找引用链 - 个人总结:反序列化过程如下: 1. 找到远程可以反序列化的点。 2. 找到某个类中有执行命令,代码,sql的函数,且是可以通过反序列化覆盖的点。 3. 找到调用可以执行命令,代码,sql的反序列化函数的利用链。 4. 上传反序列化POC,调用反序列化链执行。 ### 举例 - wecenter反序列化造成任意SQL语句执行 > https://www.leavesongs.com/PENETRATION/wecenter-unserialize-arbitrary-sql-execute.html - 找到反序列化点 ```php <?php public function authorization_action() { $this->model('account')->logout(); unset(AWS_APP::session()->WXConnect); if (get_setting('weixin_account_role') != 'service') { H::redirect_msg(AWS_APP::lang()->_t('此功能只适用于通过微信认证的服务号')); } else if ($_GET['code'] OR $_GET['state'] == 'OAUTH') { if ($_GET['state'] == 'OAUTH') { $access_token = unserialize(base64_decode($_GET['access_token'])); } ``` - 找到可以利用的类 ```php <?php class AWS_MODEL { ... /** * Model 类析构, 执行延迟查询 { */ public function __destruct() { $this->master(); foreach ($this->_shutdown_query AS $key => $query) { $this->query($query); } } } ``` - 这里有__destruct函数,我们可以看到,这里直接遍历了_shutdown_query对象,将其值传入query直接执行。 - 明显存在一个任意SQL语句执行漏洞,只要我生成一个AWS_MODEL类对象,再其销毁的时候就能执行任意SQL语句。 - 利用链就是这个析构函数本身。
别卷了
2024年10月12日 16:07
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码