Thinkphp6.0.x反序列化漏洞复现

漏洞起点

起因: 在做 [安洵杯 2019]iamthinking 时发现是 thinkphp6 的反序列化,那么就去复现一下呗。

看了其他大佬的 wp,上面说 tp6 的反序列化漏洞的后半段利用和 tp5.2.x 是一样的,也就是 __toString 函数上。

第一步相信大家都知道,全局搜索 __destruct ,查找可以利用的点。

选择的标准:
那么有什么选择的标准呢?我是这么想的,就这个版本而言,假定我们先前不知道哪边有漏洞,那么我们在找漏洞的时候可以先看看前几个版本有什么漏洞,有可能它在修好漏洞的时候,又产生了新的漏洞,或者漏洞依然存在,只是利用方式不同罢了,那么借助这个思路我们可以先看看 tp5.2.x 的漏洞产生点,也就是 __toString 函数上。

全局搜索后可以发现在 Conversion.php__toString 往下推会产生一个漏洞。

__toString => toJson => toArray => getAttr => getValue

可以通过可控的属性进行命令执行。
在这里插入图片描述
那么我们这边选择 __destruct 的要求就很明显了,一直往下执行直到有地方能够触发 __toString

这边选择如下图:

在这里插入图片描述

__toString 的触发点为:

save => updateData => checkAllowFields

checkAllowFields 中可以看到有一个字符串连接,而这就是 __toString 的触发点。

在这里插入图片描述

步骤分析

第一步触发 __toString

我们首先要绕过 save 函数的第一个 if 判断。
在这里插入图片描述
isEmpty 函数只需要 $this->data 不为空即可。

在这里插入图片描述
tigger 函数中 $this->withEventfalse 就行。
在这里插入图片描述
然后就是 save 函数的 $this->exists 存在,则进入 updateData()
在这里插入图片描述
updateData() 函数的第一步和上一步一样。

在这里插入图片描述
接着就是 $ data 要存在绕过下面的 if,也就是 getChangedData 中的 $this->forcetrue
在这里插入图片描述
在这里插入图片描述

然后就进入了 checkAllowFields 函数,只需要令 $this->table__toString 的类或者其他。
在这里插入图片描述
简单记录一下流程:

触发 __toString:

svae():
isEmpty()::
防范ThinkPHP v6.0.x反序列化漏洞可从以下几个方面着手: #### 输入验证与过滤 对所有用户输入进行严格的验证和过滤,防止恶意数据进入反序列化流程。在接收用户数据时,使用白名单机制,只允许合法的数据格式和内容通过。例如,在PHP中可以使用`filter_var`函数对输入进行过滤: ```php $input = $_POST['data']; if (!filter_var($input, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z0-9]+$/")))) { die('Invalid input'); } ``` #### 序列化数据的存储与传输 在存储和传输序列化数据时,对其进行加密和签名处理。加密可以防止数据在传输过程中被窃取和篡改,签名可以确保数据的完整性和真实性。例如,使用`openssl_encrypt`函数对序列化数据进行加密: ```php $serialized_data = serialize($data); $key = "your_secret_key"; $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); $encrypted_data = openssl_encrypt($serialized_data, 'aes-256-cbc', $key, 0, $iv); ``` #### 框架配置与更新 及时更新ThinkPHP框架到最新版本,因为官方通常会修复已知的安全漏洞。同时,合理配置框架的安全选项,如关闭不必要的功能和模块,减少攻击面。 #### 反序列化前的检查 在进行反序列化操作之前,对数据进行完整性检查和合法性验证。可以通过检查数据的长度、格式、签名等信息来判断数据是否合法。例如: ```php $received_data = $_POST['encrypted_data']; $received_iv = $_POST['iv']; $key = "your_secret_key"; $decrypted_data = openssl_decrypt($received_data, 'aes-256-cbc', $key, 0, $received_iv); if (strpos($decrypted_data, 'O:') === 0) { // 检查是否为对象序列化数据 $allowed_classes = array('AllowedClass1', 'AllowedClass2'); $class_name = substr($decrypted_data, 2, strpos($decrypted_data, ':') - 2); if (!in_array($class_name, $allowed_classes)) { die('Invalid class in serialized data'); } } $unserialized_data = unserialize($decrypted_data); ``` #### 日志与监控 建立完善的日志系统,记录所有的反序列化操作和相关的用户输入。通过监控日志,可以及时发现异常的反序列化行为,并采取相应的措施。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值