PHP反序列化漏洞可通过三类日志快速定位:PHP错误日志(关注unserialize、权限错误等)、Web访问日志(搜索phar://、__destruct及序列化字符串)、应用自定义日志(查SessionHandler或filterValue异常);结合攻击特征与四步响应法可高效处置。

PHP反序列化漏洞一旦被利用,往往不会在常规访问日志中留下明显痕迹,但结合应用行为、错误日志与运行时上下文,仍可快速定位异常。关键不在于“有没有日志”,而在于“看哪几类日志、关注哪些字段、如何交叉验证”。
重点关注的三类日志源
不是所有日志都同等有效。应优先排查以下三类:
-
PHP错误日志(error_log):开启
log_errors=On且error_reporting=E_ALL时,可能捕获__wakeup()中调用file_put_contents失败、system()执行超时或eval()语法错误等异常;特别留意含“unserialize”、“Invalid argument”、“Call to undefined function”或“Permission denied”的行 -
Web服务器访问日志(如Apache access.log 或 Nginx access.log):搜索含
unserialize、phar://、__destruct等关键词的请求参数;重点筛查GET或POST中出现长串类似O:4:"User":2:{s:8:"username";s:5:"admin";...}结构的参数值;注意非常规User-Agent(如含“python-requests”或空UA)与高频短间隔请求 -
应用层自定义日志(如ThinkPHP的runtime/log/、Laravel的storage/logs/):若框架启用了调试日志或Session操作记录,可查到反序列化触发点,例如
SessionHandler::read()返回异常序列化数据、或Request::filterValue()递归处理时抛出警告
从日志中识别典型攻击特征
攻击者构造的序列化载荷虽隐蔽,但在日志中会暴露模式性线索:
-
Phar文件利用痕迹:Nginx/Apache日志中出现
phar://xxx.jpg/.php或phar:///tmp/evil.phar等路径;PHP错误日志报phar error: invalid phar或stream_wrapper_register(): duplicate wrapper -
POP链触发行为:多个连续请求中,同一IP反复提交不同类名的序列化字符串(如
O:6:"Logger":1:{...}、O:7:"CacheDB":1:{...}),且后续请求出现文件写入(file_put_contents)、命令执行(system("id"))或数据库连接失败日志 -
__wakeup()绕过尝试:日志中出现大量
unserialize(): Error at offset X of Y bytes,尤其是偏移量集中在__wakeup前后的请求,常为攻击者在测试版本差异(如PHP 7.0+对__wakeup参数数量校验更严)
应急响应四步操作法
发现可疑日志后,需立即阻断、确认、溯源、加固:
-
临时阻断:在Web服务器配置中全局拦截含
phar://、ogg://、expect://等协议的请求;对所有含unserialize(、session_decode(、__wakeup字样的参数做403拦截(仅限应急) -
代码定位:根据日志中触发路径(如
/index.php?data=...),快速检索项目中所有unserialize(、session_start(、phar://调用点;重点检查Cookie、GET、POST、文件上传回调等用户可控入口 -
现场取证:若系统仍在线,检查
/tmp、/var/tmp下是否有新生成的PHP文件、可疑Shell脚本或.phar文件;用lsof -i :80和ps aux | grep -E "(php|sh|nc|perl)"排查异常进程 -
配置加固:禁用危险函数(
disable_functions=unserialize,phar_create,phar_extract);关闭allow_url_include=Off;将session.serialize_handler设为php_serialize(避免旧版php处理器解析恶意对象)
日志分析工具与辅助技巧
人工筛查效率低,建议配合轻量工具提升响应速度:
- 用
grep -E 'O:[0-9]+:"[A-Za-z0-9_]+":[0-9]+:' access.log快速提取疑似序列化字符串 - 编写Python小脚本,对日志中提取的序列化串尝试
unserialize()反推类名与属性,识别是否含已知危险类(如Monolog\Handler\SyslogHandler、Illuminate\Broadcasting\PendingBroadcast) - 启用PHP的
auto_prepend_file加载一个钩子脚本,在每次unserialize()前记录调用栈与输入来源($_SERVER['REQUEST_URI']、debug_backtrace()),无需修改业务代码即可实现运行时监控
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











