红队-java代码审计生命周期
字数 2252 2025-08-11 21:26:29

Java代码审计生命周期与漏洞挖掘指南

一、Java代码审计生命周期概述

Java代码审计是一个系统化的过程,主要包括以下阶段:

  1. 源码获取
  2. 审计环境配置
  3. 代码审计
  4. POC&EXP编写
  5. 后渗透利用
  6. 相关文档输出

二、源码获取方法

  1. 开源/二次开发源码获取

    • 官网、GitHub、码云等平台
    • 网盘搜索
    • 咸鱼、淘宝、TG等交易平台
    • 云市场
  2. 相似站点扫描

    • 批量扫描备份文件
    • 通过相似站点getshell后打包源码

三、审计环境配置

基本审计工具配置:

  • IDE:IDEA、VSCode
  • JDK版本:根据源码支持的版本选择(通常JDK8)
  • Web服务器:Tomcat
  • 测试工具:Burp Suite
  • 反编译工具:JD-GUI

四、快速代码审计方法

1. 快速定位可访问资源

方法一:提取全部JSP文件

find /domain/ -name "*.jsp"

用Burp批量测试返回200的路径,分析未认证可访问的JSP文件

方法二:分析web.xml

  • 提取servlet-name路径
  • 用Burp批量测试servlet路径
  • 根据servlet-class逆向分析相关class代码

方法三:提取JS/HTML中的URL接口

  • 批量提取JS/HTML中的URL和path路径
  • 用Burp批量测试

2. Spring Boot项目结构分析

代码结构

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

资源目录结构

/src/main/resources/
├── mapper/            # MyBatis的mapper.xml
├── static/            # 静态资源(JS/CSS/图片)
├── templates/         # 模板文件
├── application.properties  # Spring Boot默认配置
├── META-INF/          # 配置应用程序、扩展程序
└── i18n/              # 国际化文件

3. Java请求传递流程

  1. 用户请求 → Tomcat等中间件 → DispatcherServlet
  2. 经过Filter和Interceptor
  3. DispatcherServlet分配到对应Controller
  4. Controller调用Service
  5. Service调用Dao进行数据库操作
  6. 返回响应

示例流程

用户请求 → Filter → Interceptor → Controller → Service → Dao → Mapper.xml

五、常见漏洞审计方法

1. SQL注入漏洞

成因:用户输入直接拼接到SQL语句中

常见场景

  • DAO层拼接SQL:"select * from user where id="+id
  • Hibernate:session.createQuery("from Book where title like '%" + userInput + "%'")
  • MyBatis:
    Select * from news where title like '%${title}%'
    Select * from news where id in (${id})
    Select * from news where title ='java' order by ${time} asc
    

审计方法

  1. 查找与数据库交互的代码
  2. 检查用户输入是否过滤
  3. 重点关注:
    • MyBatis中的like、in和order by语句
    • Hibernate中的createQuery()函数

修复方案

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

2. XSS漏洞

类型:反射型、存储型、DOM型

示例代码

@RequestMapping("/xss")
public ModelAndView xss(HttpServletRequest request) {
    String name = request.getParameter("name");  // 用户输入
    ModelAndView mav = new ModelAndView("mmc");
    mav.getModel().put("uname", name);  // 直接输出
    return mav;
}

审计方法:全局搜索用户输入与输出,检查过滤情况

修复方案

  1. 配置全局过滤器:
<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>
  1. 使用StringEscapeUtils:
StringEscapeUtils.escapeHtml(string);
StringEscapeUtils.escapeJavaScript(string);

3. XXE漏洞

成因:XML解析时允许引用外部实体

审计方法:查找以下XML解析函数:

javax.xml.parsers.DocumentBuilder
javax.xml.stream.XMLStreamReader
org.jdom.input.SAXBuilder
javax.xml.parsers.SAXParser
org.dom4j.io.SAXReader
org.xml.sax.XMLReader
...

修复方案

  1. 禁用外部实体
  2. 使用白名单校验输入
  3. 使用dom4j构建XML(自动编码)

4. SSRF漏洞

利用方式

  • file协议任意文件读取
  • http协议端口探测

支持协议:file, ftp, mailto, http, https, jar, netdoc

漏洞代码示例

String url = request.getParameter("url");
URL u = new URL(url);
URLConnection conn = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

审计方法:查找网络请求相关函数:

HttpClient.execute
HttpClient.executeMethod
HttpURLConnection.connect
HttpURLConnection.getInputStream
URL.openStream
new URL()
openConnection()
getInputStream()

修复方案

  1. 校验URL的Host和IP
  2. 禁止访问内网IP
  3. 检查跳转URL

5. 任意文件操作漏洞

类型:读取、下载、删除、修改

示例代码

@GET
@Path("/images/{image}")
public Response getImage(@PathParam("image") String image) {
    File file = new File("resources/images/", image);  // 未过滤
    return Response.ok().entity(new FileInputStream(file)).build();
}

审计方法:搜索关键字:

FileInputStream
getPath
getAbsolutePath
ServletFileUpload

修复方案

  1. 使用File.getCanonicalPath()解析路径
  2. 配置全局安全策略

6. 命令执行漏洞

危险函数

Runtime.exec()
Process
ProcessBuilder.start()

示例代码

String dir = System.getProperty("dir");
Process process = Runtime.getRuntime().exec("cmd.exe /c dir" + dir);

审计方法:查找命令执行相关函数

修复方案:正则校验输入

if (!Pattern.matches("[0-9A-Za-z@.]+", dir)) {
    // 拒绝非法输入
}

7. 反序列化漏洞

危险函数

ObjectInputStream.readObject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject

审计场景

  • 导入模板文件
  • 网络通信
  • 数据传输
  • 日志存储
  • 数据库存储

修复方案

  1. 升级依赖jar包和JDK
  2. 反序列化前检查InputStream

8. 中间件漏洞

常见Java中间件

Tomcat
WebLogic
WebSphere
JBoss
GlassFish
Jetty
Resin

审计方法:检查pom.xml中的中间件版本,匹配已知漏洞

9. 业务逻辑漏洞

主要类型:平行越权、垂直越权

审计方法

  1. 检查每个request.getParameter("userid")后是否有权限校验
  2. 验证当前用户与操作对象的所属关系

修复方案

  1. 校验当前用户权限
  2. 从会话中获取用户标识,而非请求参数

六、其他重要漏洞

1. LDAP注入

漏洞代码

NamingEnumeration<SearchResult> answers = context.search(
    "dc=People,dc=example,dc=com", 
    "(uid=" + username + ")", 
    ctrls);

修复方案:严格校验输入参数

2. JNDI注入

关键函数

InitialContext.lookup()
bind()

攻击方式:控制URI参数指向恶意RMI服务

3. RMI反序列化

关键类

ObjectOutputStream.writeObject()
ObjectInputStream.readObject()

RMI协议格式rmi://host:port/name

4. 表达式注入

危险函数

SpelExpressionParser
getValue

漏洞代码

<spring:eval expression="${param.lang}" var="lang" />

修复方案

<c:set var="lang" value="${param.lang}"/>

七、自动化审计工具

推荐使用Cryin/JavaID工具自动识别危险函数:

检测规则示例

XXE: "SAXReader", "DocumentBuilder", "XMLStreamReader"
反序列化: "readObject", "readUnshared", "Yaml.load"
SSRF: "HttpClient", "Socket", "URL", "HttpURLConnection"
文件操作: "MultipartFile", "createNewFile", "FileInputStream"
表达式注入: "SpelExpressionParser", "getValue"
命令执行: "getRuntime.exec", "ProcessBuilder.start"

八、POC&EXP编写

  1. 编写漏洞检测利用脚本(py/exe/jar等形式)
  2. 开发批量检测脚本
  3. 适配内存马注入

九、后渗透利用

  1. 定位数据库配置文件(可能需要解密)
  2. 获取业务敏感数据(如管理员凭证)
  3. 适配代理工具进行内网渗透
  4. 获取主机敏感信息
  5. 扩大攻击面

十、文档输出要求

  1. 漏洞文档

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

    • POC&EXP使用说明
  3. 环境文档

    • 环境搭建指南
    • 环境密码信息
  4. 架构分析

    • 使用框架分析
    • 鉴权机制
    • 风险点总结
    • 整体路由图
    • 重要配置文件分析

十一、参考资源

  1. Java安全漫谈
  2. Java代码审计系列文章
  3. Java安全编码指南
  4. Java反序列化漏洞详解
Java代码审计生命周期与漏洞挖掘指南 一、Java代码审计生命周期概述 Java代码审计是一个系统化的过程,主要包括以下阶段: 源码获取 审计环境配置 代码审计 POC&EXP编写 后渗透利用 相关文档输出 二、源码获取方法 开源/二次开发源码获取 : 官网、GitHub、码云等平台 网盘搜索 咸鱼、淘宝、TG等交易平台 云市场 相似站点扫描 : 批量扫描备份文件 通过相似站点getshell后打包源码 三、审计环境配置 基本审计工具配置: IDE:IDEA、VSCode JDK版本:根据源码支持的版本选择(通常JDK8) Web服务器:Tomcat 测试工具:Burp Suite 反编译工具:JD-GUI 四、快速代码审计方法 1. 快速定位可访问资源 方法一:提取全部JSP文件 用Burp批量测试返回200的路径,分析未认证可访问的JSP文件 方法二:分析web.xml 提取servlet-name路径 用Burp批量测试servlet路径 根据servlet-class逆向分析相关class代码 方法三:提取JS/HTML中的URL接口 批量提取JS/HTML中的URL和path路径 用Burp批量测试 2. Spring Boot项目结构分析 代码结构 : 资源目录结构 : 3. Java请求传递流程 用户请求 → Tomcat等中间件 → DispatcherServlet 经过Filter和Interceptor DispatcherServlet分配到对应Controller Controller调用Service Service调用Dao进行数据库操作 返回响应 示例流程 : 五、常见漏洞审计方法 1. SQL注入漏洞 成因 :用户输入直接拼接到SQL语句中 常见场景 : DAO层拼接SQL: "select * from user where id="+id Hibernate: session.createQuery("from Book where title like '%" + userInput + "%'") MyBatis: 审计方法 : 查找与数据库交互的代码 检查用户输入是否过滤 重点关注: MyBatis中的like、in和order by语句 Hibernate中的createQuery()函数 修复方案 : 2. XSS漏洞 类型 :反射型、存储型、DOM型 示例代码 : 审计方法 :全局搜索用户输入与输出,检查过滤情况 修复方案 : 配置全局过滤器: 使用StringEscapeUtils: 3. XXE漏洞 成因 :XML解析时允许引用外部实体 审计方法 :查找以下XML解析函数: 修复方案 : 禁用外部实体 使用白名单校验输入 使用dom4j构建XML(自动编码) 4. SSRF漏洞 利用方式 : file协议任意文件读取 http协议端口探测 支持协议 :file, ftp, mailto, http, https, jar, netdoc 漏洞代码示例 : 审计方法 :查找网络请求相关函数: 修复方案 : 校验URL的Host和IP 禁止访问内网IP 检查跳转URL 5. 任意文件操作漏洞 类型 :读取、下载、删除、修改 示例代码 : 审计方法 :搜索关键字: 修复方案 : 使用File.getCanonicalPath()解析路径 配置全局安全策略 6. 命令执行漏洞 危险函数 : 示例代码 : 审计方法 :查找命令执行相关函数 修复方案 :正则校验输入 7. 反序列化漏洞 危险函数 : 审计场景 : 导入模板文件 网络通信 数据传输 日志存储 数据库存储 修复方案 : 升级依赖jar包和JDK 反序列化前检查InputStream 8. 中间件漏洞 常见Java中间件 : 审计方法 :检查pom.xml中的中间件版本,匹配已知漏洞 9. 业务逻辑漏洞 主要类型 :平行越权、垂直越权 审计方法 : 检查每个 request.getParameter("userid") 后是否有权限校验 验证当前用户与操作对象的所属关系 修复方案 : 校验当前用户权限 从会话中获取用户标识,而非请求参数 六、其他重要漏洞 1. LDAP注入 漏洞代码 : 修复方案 :严格校验输入参数 2. JNDI注入 关键函数 : 攻击方式 :控制URI参数指向恶意RMI服务 3. RMI反序列化 关键类 : RMI协议格式 : rmi://host:port/name 4. 表达式注入 危险函数 : 漏洞代码 : 修复方案 : 七、自动化审计工具 推荐使用 Cryin/JavaID 工具自动识别危险函数: 检测规则示例 : 八、POC&EXP编写 编写漏洞检测利用脚本(py/exe/jar等形式) 开发批量检测脚本 适配内存马注入 九、后渗透利用 定位数据库配置文件(可能需要解密) 获取业务敏感数据(如管理员凭证) 适配代理工具进行内网渗透 获取主机敏感信息 扩大攻击面 十、文档输出要求 漏洞文档 : 完整漏洞细节及原理 复现步骤 工具文档 : POC&EXP使用说明 环境文档 : 环境搭建指南 环境密码信息 架构分析 : 使用框架分析 鉴权机制 风险点总结 整体路由图 重要配置文件分析 十一、参考资源 Java安全漫谈 Java代码审计系列文章 Java安全编码指南 Java反序列化漏洞详解