搜索

通用php反序列化攻击

发表于 2026-10-17 02:22:13 来源:烟消火灭网

PHP反序列化漏洞的通用攻击链,本质上就是序列一场关于类型欺骗与魔术方法的博弈。攻击者提交一个精心构造的化攻字符串,PHP的通用unserialize()函数便忠实地将其还原成内存中的对象——这过程本身不执行任何业务代码,但对象析构、序列属性赋值、化攻方法调用这些“副作用”却会像多米诺骨牌一样被推倒。通用

最典型的序列案例是ThinkPHP框架的RCE漏洞。开发者把用户可控的化攻cookie直接丢进unserialize(),攻击者只需构造一个含有__destruct()方法的通用类,在其析构时调用call_user_func,序列就能把system('whoami')变成现实。化攻这里的通用关键不在unserialize()本身,而在它触发的序列魔术方法链——__wakeup()、__toString()、化攻__call(),每一个都是潜在的跳板。

攻击者真正要解决的是“怎么把恶意对象传进去”。常见的入口有三类:会话存储(比如CodeIgniter把session序列化后存文件)、数据库缓存字段(Laravel的缓存驱动)、HTTP参数(比如Java的ObjectInputStream风格,但PHP更直接——直接传序列化字符串)。

但光有入口还不够。你得知道目标环境里有哪些类可用。这叫“gadget chain”搜索——像拼乐高一样,把框架自带类的魔术方法拼接成一条通向命令执行的路径。Yii2的yii\rest\CreateAction配合Faker\Generator就是个经典组合:前者在run()里调用$this->checkAccess,后者在__call()里能调用任意对象的方法,一环扣一环,最后落到proc_open()上。

防御方最常犯的错误是“黑名单思维”。过滤掉O:开头的字符串?攻击者加个空格变成O:8:"stdClass"就绕过了——PHP的序列化解析器对格式容忍度极高,甚至允许O:+8这种写法。更狠的是用C:自定义序列化格式,或者干脆用S:带十六进制转义的字符串,直接绕过正则。

真正有效的防护只有两条路:永远不要反序列化不可信数据,或者用allowed_classes参数白名单化类名。PHP 7.0以后unserialize()的第二个参数能限制可实例化的类,但很多老代码根本没传这个参数。另一个隐蔽的坑是__wakeup()绕过——CVE-2016-7124利用对象属性数量大于实际数量,让PHP跳过__wakeup()执行,这种老漏洞至今还在不少CMS里躺着。

我见过最讽刺的案例是某安全设备的管理后台,它本身用PHP写的,把登录用户的序列化数据存Redis。攻击者通过Redis未授权访问写入恶意对象,然后等管理员登录时触发反序列化——安全设备反而成了跳板。所以别把“内网数据”当成安全边界,序列化数据一旦出圈,就是脱缰的野马。

攻击者视角下,最幸福的事是遇到__destruct()里直接调用文件操作函数的类。比如Guzzle的CookieJar在析构时会把数据写回文件,如果路径可控,那就直接getshell了。这种漏洞不需要复杂链,一个对象足矣。

最后说点实操建议:代码审计时优先搜unserialize(,再反向追踪数据流。如果发现入口参数直接拼接进序列化字符串,那基本可以放弃抵抗了——攻击者连对象结构都不用猜,直接注入属性就行。修漏洞时别只加过滤,把unserialize()换成json_decode()配合手动映射数组,彻底断掉对象实例化的路,才是治本之策。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by 通用php反序列化攻击,烟消火灭网   sitemap

回顶部