PHP反序列化与文件上传组合构成攻击闭环:前者提供触发时机和逻辑跳转,后者实现恶意内容落盘,二者串联可绕过常规防护稳定执行代码。

PHP反序列化漏洞配合文件上传,不是两个漏洞简单相加,而是一套能绕过常规防护、稳定落地执行的攻击闭环。关键在于:反序列化提供“触发时机”和“可控逻辑跳转”,文件上传提供“内容落盘能力”,两者一前一后,让攻击者能把恶意代码真正写进服务器并执行。
为什么这个组合特别危险
单独的反序列化漏洞常受限于环境——比如没有可利用的魔术方法、POP链不完整、或目标类不可用;单独的文件上传漏洞又往往被限制扩展名、MIME类型或路径,无法直接执行PHP。但一旦串联:
- 文件上传让攻击者把恶意内容(如带shell的图片、序列化对象)存到服务器某个可访问目录
- 反序列化则负责在合适时机(如对象销毁、反序列化完成)调用
file_put_contents、include或eval等函数,把已上传的内容加载或执行 - 典型场景是:上传一个伪造的session文件或缓存文件 → 反序列化时触发
__wakeup或__destruct→ 动态拼接路径并include刚上传的文件
常见组合利用路径
真实案例中高频出现的链路有三类:
-
上传+缓存覆盖+反序列化触发:如PHPOK的
cache.php,save()方法将用户控制的$id拼成文件名,$content序列化后写入$id.".php"。攻击者传入$id=shell、$content为构造好的恶意对象,再通过__destruct调用save,即可生成可访问的shell.php -
上传+日志包含+反序列化读取:攻击者先上传含PHP代码的图片,再触发错误使该图片路径写入Apache/Nginx日志;随后利用反序列化中的
__toString或__get触发file_get_contents读日志,再用php://filter解码执行 -
上传+Session伪造+反序列化自动加载:若应用将用户数据存入session且未校验签名,攻击者可上传含恶意序列化字符串的session文件(如
sess_xxx),再通过反序列化入口(如unserialize($_SESSION['data']))触发POP链,最终执行写入的代码
防御要点不能只盯单点
这类组合攻击失效的前提,是任一环节被阻断。所以修复必须覆盖全链:
立即学习“PHP免费学习笔记(深入)”;
- 文件上传侧:禁用动态解析(如关闭
upload_max_filesize外的执行权限)、重命名文件、校验内容头(不只是扩展名)、存储目录禁止PHP解析 - 反序列化侧:避免直接
unserialize()外部输入;改用JSON等安全格式;若必须用,需严格白名单类名,并在__wakeup中校验属性完整性 - 关键函数兜底:对
include、file_put_contents、eval等函数做运行时监控,拦截含php://、data://、../../等危险模式的参数
检测时重点关注耦合点
审计代码时,别只看unserialize()那一行。要顺着找:
- 哪些地方会把用户上传的文件路径、session ID、缓存key拼进
include或file_get_contents? - 哪些类的
__destruct、__wakeup里调用了文件操作或动态包含? - 上传后的文件是否可能被后续反序列化流程间接引用?比如上传后返回ID,该ID又被存入session并参与下次反序列化?



















