红队java代码审计生命周期
字数 1310 2025-08-24 20:49:22

Java代码审计生命周期与漏洞分析指南

一、红队Java代码审计生命周期

  1. 源码获取途径

    • 开源/二开项目(官网、GitHub、码云)
    • 相似站点批量扫描备份文件
    • 网盘搜索、咸鱼、淘宝、TG等平台
    • 云市场获取
  2. 审计环境配置

    • 开发工具:IDEA、VSCode
    • 运行环境:JDK8(根据源码支持版本)、Tomcat
    • 辅助工具:Burp Suite、JD-GUI
  3. 代码审计方法

    • 快速审计方法:
      • 提取全部JSP文件进行目录扫描
      • 分析web.xml中的servlet路径
      • 批量提取JS/HTML中的URL接口
    • 关键sink函数定位
  4. 后续流程

    • POC&EXP编写
    • 后渗透利用
    • 相关文档输出

二、SpringBoot项目结构分析

代码目录结构

/src/main/java/
├── common/        # 通用类、工具类
├── config/        # 配置文件
├── controller/    # 控制器
├── dao/           # 数据访问层
├── entity/        # 实体类
├── interceptor/   # 拦截器
├── service/       # 业务逻辑处理
│   ├── Service接口
│   └── ServiceImpl实现类
├── utils/         # 工具类
├── dto/           # 数据传输对象
├── vo/            # 视图对象
├── constant/      # 常量
├── filter/        # 过滤器
└── component/     # 组件

资源目录结构

/src/main/resources/
├── mapper/            # MyBatis的mapper.xml
├── static/            # 静态资源
├── templates/         # 模板文件
├── application.properties  # 配置文件
└── META-INF/          # 配置信息包

三、Java请求传递流程

  1. 请求处理流程

    • 用户请求 → Tomcat → DispatcherServlet
    • 经过Filter和Interceptor
    • 分配到对应Controller
    • 调用Service处理业务逻辑
    • 涉及数据库操作时调用Dao层
  2. 分层架构

    • 视图层(View)
    • 控制层(Controller/Action)
    • 服务层(Service)
    • 业务逻辑层(BO)
    • 实体层(Entity/VO/Bean)

四、常见漏洞审计与修复

1. SQL注入漏洞

审计方法:

  • 查找SQL拼接点:+ id${title}${id}
  • 重点关注:
    • MyBatis中的like、in和order by语句
    • Hibernate中的createQuery()函数

修复方案:

// 使用预编译
String sql = "select * from users where username=? and password=?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

2. XSS漏洞

审计方法:

  • 全局搜索用户输入与输出点
  • 检查是否直接输出用户输入

修复方案:

// 配置全局过滤器
<filter>
  <filter-name>XssSafe</filter-name>
  <filter-class>XssFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>XssSafe</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

// 使用StringEscapeUtils
StringEscapeUtils.escapeHtml(string);
StringEscapeUtils.escapeJavaScript(string);

3. XXE漏洞

审计方法:

  • 搜索XML解析函数:
    DocumentBuilder, XMLStreamReader, SAXBuilder, 
    SAXParser, XMLReader, SAXSource, 
    TransformerFactory, SchemaFactory, Unmarshaller
    

修复方案:

// 禁用外部实体
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

4. SSRF漏洞

审计方法:

  • 查找网络请求函数:
    HttpClient.execute(), HttpURLConnection.connect(), 
    URL.openStream(), new URL(), openConnection()
    

修复方案:

// 验证URL是否为内网地址
private static boolean isInnerIP(String url) {
    String host = new URL(url).getHost();
    InetAddress ia = InetAddress.getByName(host);
    String ip = ia.getHostAddress();
    return ip.startsWith("10.") || ip.startsWith("192.168.") 
           || ip.startsWith("172.16.") || ip.startsWith("127.");
}

5. 文件操作漏洞

审计方法:

  • 搜索文件操作函数:
    FileInputStream, getPath, getAbsolutePath, ServletFileUpload
    

修复方案:

// 使用规范路径
File file = new File("resources/images/", image);
String canonicalPath = file.getCanonicalPath();
if (!canonicalPath.startsWith("/var/www/resources/images/")) {
    throw new SecurityException("Invalid file path");
}

6. 命令执行漏洞

审计方法:

  • 搜索危险函数:
    Runtime.exec(), ProcessBuilder.start(), GroovyShell.evaluate()
    

修复方案:

// 使用白名单校验
if (!Pattern.matches("[0-9A-Za-z@.]+", input)) {
    throw new IllegalArgumentException("Invalid input");
}

7. 反序列化漏洞

审计方法:

  • 查找反序列化操作:
    ObjectInputStream.readObject(), XMLDecoder.readObject(), 
    XStream.fromXML(), ObjectMapper.readValue()
    

修复方案:

  • 升级依赖库版本
  • 使用白名单校验反序列化类

五、其他重要漏洞

1. JNDI注入

审计方法:

  • 查找InitialContext.lookup()调用
  • 检查参数是否可控

修复方案:

// 限制JNDI查找
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "false");
System.setProperty("com.sun.jndi.cosnaming.object.trustURLCodebase", "false");

2. 表达式注入

审计方法:

  • 查找SpelExpressionParser.getValue()
  • 检查Spring表达式是否包含用户输入

修复方案:

// 避免直接使用用户输入构建表达式
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setRootObject(safeObject);
Expression exp = parser.parseExpression(safeExpression);

六、自动化审计工具

推荐使用Cryin/JavaID进行危险函数识别:

# 关键函数搜索模式
XXE: "SAXReader", "DocumentBuilder", "XMLStreamReader", "SAXBuilder"
Deserialization: "readObject", "readUnshared", "Yaml.load", "fromXML"
SSRF: "HttpClient", "Socket", "URL", "ImageIO", "HttpURLConnection"
File: "MultipartFile", "createNewFile", "FileInputStream"
SpEL: "SpelExpressionParser", "getValue"
Exec: "getRuntime.exec", "ProcessBuilder.start", "GroovyShell.evaluate"

七、后渗透利用

  1. 数据库信息获取

    • 查找数据库配置文件位置
    • 解密数据库密码(如有加密)
  2. 业务攻击面扩展

    • 获取管理员/用户凭证
    • 适配代理工具进行内网渗透
  3. 敏感信息收集

    • 主机敏感文件扫描
    • 进一步扩大利用范围

八、文档输出要求

  1. 漏洞文档

    • 完整漏洞细节及原理分析
    • 复现步骤与截图
  2. 工具文档

    • POC/EXP使用说明
    • 环境搭建指南
  3. 架构分析

    • 框架使用情况
    • 鉴权机制分析
    • 风险点总结
    • 整体路由梳理
    • 重要配置文件说明

通过以上系统化的审计方法,可以全面覆盖Java应用程序的安全风险点,有效发现和修复各类安全漏洞。

Java代码审计生命周期与漏洞分析指南 一、红队Java代码审计生命周期 源码获取途径 开源/二开项目(官网、GitHub、码云) 相似站点批量扫描备份文件 网盘搜索、咸鱼、淘宝、TG等平台 云市场获取 审计环境配置 开发工具:IDEA、VSCode 运行环境:JDK8(根据源码支持版本)、Tomcat 辅助工具:Burp Suite、JD-GUI 代码审计方法 快速审计方法: 提取全部JSP文件进行目录扫描 分析web.xml中的servlet路径 批量提取JS/HTML中的URL接口 关键sink函数定位 后续流程 POC&EXP编写 后渗透利用 相关文档输出 二、SpringBoot项目结构分析 代码目录结构 资源目录结构 三、Java请求传递流程 请求处理流程 用户请求 → Tomcat → DispatcherServlet 经过Filter和Interceptor 分配到对应Controller 调用Service处理业务逻辑 涉及数据库操作时调用Dao层 分层架构 视图层(View) 控制层(Controller/Action) 服务层(Service) 业务逻辑层(BO) 实体层(Entity/VO/Bean) 四、常见漏洞审计与修复 1. SQL注入漏洞 审计方法: 查找SQL拼接点: + id 、 ${title} 、 ${id} 重点关注: MyBatis中的like、in和order by语句 Hibernate中的createQuery()函数 修复方案: 2. XSS漏洞 审计方法: 全局搜索用户输入与输出点 检查是否直接输出用户输入 修复方案: 3. XXE漏洞 审计方法: 搜索XML解析函数: 修复方案: 4. SSRF漏洞 审计方法: 查找网络请求函数: 修复方案: 5. 文件操作漏洞 审计方法: 搜索文件操作函数: 修复方案: 6. 命令执行漏洞 审计方法: 搜索危险函数: 修复方案: 7. 反序列化漏洞 审计方法: 查找反序列化操作: 修复方案: 升级依赖库版本 使用白名单校验反序列化类 五、其他重要漏洞 1. JNDI注入 审计方法: 查找 InitialContext.lookup() 调用 检查参数是否可控 修复方案: 2. 表达式注入 审计方法: 查找 SpelExpressionParser.getValue() 检查Spring表达式是否包含用户输入 修复方案: 六、自动化审计工具 推荐使用 Cryin/JavaID 进行危险函数识别: 七、后渗透利用 数据库信息获取 查找数据库配置文件位置 解密数据库密码(如有加密) 业务攻击面扩展 获取管理员/用户凭证 适配代理工具进行内网渗透 敏感信息收集 主机敏感文件扫描 进一步扩大利用范围 八、文档输出要求 漏洞文档 完整漏洞细节及原理分析 复现步骤与截图 工具文档 POC/EXP使用说明 环境搭建指南 架构分析 框架使用情况 鉴权机制分析 风险点总结 整体路由梳理 重要配置文件说明 通过以上系统化的审计方法,可以全面覆盖Java应用程序的安全风险点,有效发现和修复各类安全漏洞。