反序列化工具
反序列化工具
上周帮同事看一个 Java 服务的内存马,dump 下来一堆 ObjectInputStream 的列化调用栈。他问我:“有没有那种一键反序列化的工具工具?把 payload 丢进去就告诉我执行了什么。” 我回他:“有,反序但别指望它替你思考。列化”
反序列化工具分两种。工具一种是反序语言自带的原生接口,比如 Python 的列化 pickle.loads()、Java 的工具 ObjectInputStream.readObject()、PHP 的反序 unserialize()。它们本身不是列化“工具”,是工具语言特性,但恰恰是反序漏洞的源头。另一种是列化安全圈造的轮子,像 ysoserial、工具marshalsec、phpggc,用来生成 payload 或者解析字节流。前者是刀,后者是磨刀石。
我最早接触的是 ysoserial。2016 年那会儿,Java 反序列化刚炸开,commons-collections 的 gadget 满天飞。当时用 ysoserial 生成一个 CommonsCollections1 的 payload,丢给漏洞点,命令就执行了。感觉像变魔术。但后来发现,工具只是把已知的利用链打包了。真正难的是找到那条链——在目标环境里,依赖版本、类加载器、黑名单,任何一个环节都能让链断掉。
有人觉得反序列化工具就是“输入 payload,输出 shell”。差得远。比如 marshalsec 主要针对 JNDI 注入,它帮你起一个 LDAP 或 RMI 服务,返回一个恶意的 Reference。但目标 JDK 版本高了,com.sun.jndi.ldap.object.trustURLCodebase 默认 false,直接歇菜。这时候工具没变,环境变了,你得换思路——用本地 Factory 或者 BeanFactory 绕。工具是死的,人是活的。
“工具只能帮你走完已知的路,未知的路得自己趟。”
PHP 那边,phpggc 更直接。它把各个框架的 gadget 链整理成列表,比如 Laravel/RCE1、Symfony/RCE2。你选一个,生成 payload,base64 编码,完事。但实际打的时候,经常遇到 __wakeup 被过滤、Serializable 接口被禁用。这时候得手动改链,把触发点换到 __destruct 或者 __toString。工具给的 payload 是模板,改不改得动,看你对代码的理解。
Python 的 pickle 更野。pickle.loads() 直接执行 __reduce__ 返回的 callable。很多人用 pickle 做 RCE,一行 os.system 就完事。但 pickle 有个问题——它太明显了。流量里出现 cos\nsystem\n 这种字节,IDS 一眼就认出来。所以后来有人搞出 pickle 的变种,比如 pickletools 优化、pickle 协议版本混淆。工具还是那个工具,对抗的是检测。
我自己的习惯是:拿到一个反序列化点,先不急着上工具。先看语言、看依赖、看版本。Java 的话,mvn dependency:tree 跑一下,看看有没有 commons-collections、groovy、spring 这些。PHP 的话,composer show 列一下包。Python 的话,pip freeze 瞅一眼。这些信息比任何工具都值钱。工具能告诉你“可能有什么链”,但只有依赖能告诉你“实际有什么链”。
还有一点,反序列化工具生成的 payload 往往很大。Java 的 ysoserial 生成的 CommonsCollections6 大概 1.5KB,base64 之后 2KB 多。有些漏洞点对长度有限制,比如 HTTP header、cookie。这时候得压缩,或者换更短的链。phpggc 有个 -b 参数做 base64,-f 做 urlencode,但长度还是摆在那。短链是稀缺资源,比如 PHP 的 Monolog/RCE1 只有几百字节,但依赖 monolog 版本。工具不会告诉你这些,得自己翻源码。
最后说个真事。去年一个项目,目标用了 Jackson 的 enableDefaultTyping。我用 marshalsec 起 JNDI 服务,结果目标不出网。换 ysoserial 的 JRMPClient,还是不行。最后用 Jackson 自己的 gadget——com.sun.rowset.JdbcRowSetImpl 配合 JNDI 打本地 LDAP 回连,才通。工具没变,思路变了。反序列化工具是锤子,但钉子长什么样,得自己看。
所以别问“哪个工具最好用”。问“这个环境里,哪条链能通”。工具只是帮你把链子拼起来,拼不拼得成,看你对代码的熟悉程度。就像开锁,工具是钩子,锁芯的结构才是关键。
```(责任编辑:热点)













