java审计-通俗的理解并审出自己的第一个漏洞
字数 2196 2025-08-10 08:28:35

Java代码审计入门指南:理解并发现第一个漏洞

1. 前言

在进行Java代码审计前,需要掌握以下基础知识:

  • Java基本语法
  • 类、方法、接口、常量等概念
  • Web应用基本架构

2. 框架识别

2.1 Struts2框架特征

  • web.xml中存在Filter-class为org.apache.struts2.dispatcher.xxxx
  • resourcessrc目录下存在struts.xml文件
  • pom.xml中存在Struts2依赖信息

2.2 SpringMVC框架特征

  • pom.xml中存在Spring相关依赖
  • web.xml中存在DispatcherServlet的注册配置

3. 审计思路

3.1 Struts2框架审计

3.1.1 过滤器及映射配置

web.xml分析

  • <filter-mapping><url-pattern>决定拦截规则
    • .action:所有以.action结尾的请求被拦截
    • /test/.action:仅test目录下的.action请求被拦截

struts.xml分析

<action name="test" method="test" class="novy.action.LoginAction"/>

表示novy.action.LoginAction类的test方法处理http://127.0.0.1/test.action请求

3.1.2 层次结构

  1. Action层

    • 业务逻辑处理层
    • 接收视图层(.jsp)请求和参数
    • 调用Model层方法完成业务逻辑
    • 控制程序流程并选择视图
    • 文件特征:XxxAction.java
  2. DAO层

    • 数据持久层
    • 处理数据库增删查改操作
    • 文件特征:XxxDao.java

3.1.3 审计实例

  1. 流程分析

    • 请求流程:Action → DAO
    • 其他目录:bean(实体处理)、db(数据库连接配置)
  2. 代码分析

    • 查看web.xml确定拦截规则
    • 查看struts.xml确定Action处理类
    • 跟进处理类(如GoLogin.java)
    • 查找参数处理方法(如checkLogin)
    • 检查SQL语句拼接情况
  3. 漏洞验证

    • 构造SQL注入Payload:Admin'or"="or--+
    • 测试请求路由(如login.jsp)

3.2 SpringMVC框架审计

3.2.1 配置分析

web.xml

  • DispatcherServlet配置确定SpringMVC作用范围
  • contextConfigLocation确定SpringMVC配置文件路径

springmvc.xml

  • component-scan查找Controller类位置
  • InternalResourceViewResolver自定义视图解析器

pom.xml

  • 声明项目信息和环境配置
  • 引用组件依赖
  • 判断是否为Maven项目

3.2.2 层次结构

  1. Controller层

    • 控制层(业务逻辑)
    • 接收客户端请求
    • 调用Service层业务逻辑
    • 传递数据给视图层
    • 文件特征:XxxController.java
    • 注解示例:
      @Controller
      @RequestMapping(value = "/novy")
      
  2. Service层

    • 业务层
    • 接收Controller数据
    • 与DAO/Mapper层交互
    • 处理业务逻辑
    • 文件特征:XxxService.java(接口定义)
  3. Impl层

    • 服务实现层
    • 实现Service接口方法
    • 文件特征:XxxImpl.java
  4. Mapper层

    • 数据持久层
    • 直接操作数据库
    • 文件特征:XxxMapper.xml
  5. DAO层

    • 数据接口层
    • 处理数据请求(内部实现)
  6. Entity层

    • 实体处理层
    • 存放实体类
    • 与数据库属性对应

请求处理流程:Controller → Service → Impl → Mapper

3.2.3 审计实例

  1. 组件分析

    • 检查pom.xml中引用的组件版本
    • 查找已知漏洞组件(如Fastjson)
  2. 代码分析

    • 全局搜索@Controllerfile mask查看所有Controller
    • 查找参数处理方法(如使用@RequestBody)
    • 跟进Service和Mapper实现
    • 检查SQL语句拼接情况(如%${}%模糊查询)
  3. 漏洞验证

    • 根据Controller构造请求URL
    • 测试参数注入点

3.3 特殊情况处理

3.3.1 SQL操作在Service层

  • 某些项目直接在Service层进行SQL查询
  • 检查未使用预编译的SQL语句

3.3.2 接口断点处理

  • 当跟进到接口定义时中断
  • 全局搜索implements查找实现类
  • 在实现类中继续审计

4. 审计技巧

4.1 命名规律

  • 请求处理流程中类名前缀通常一致
    • 如:NovyControllerNovyServiceNovyMapper.xml
  • 不一致命名需特别注意

4.2 方法跟进

  • 使用IDE(如IntelliJ IDEA)的全局搜索和跳转功能
  • 关注类实例化方式:
    private EntityManager em;  // 使用EntityManager接口
    
  • 直接跟进方法实现(Ctrl+左键)

5. 总结

  1. 框架识别是审计第一步,确定框架类型和版本
  2. 理解层次结构有助于快速定位关键代码
  3. 参数传递流程是漏洞挖掘的重点路径
  4. SQL语句拼接是常见漏洞点
  5. IDE工具能极大提高审计效率

通过系统性地分析框架配置、代码层次和参数传递,可以有效地发现Java Web应用中的安全漏洞。

Java代码审计入门指南:理解并发现第一个漏洞 1. 前言 在进行Java代码审计前,需要掌握以下基础知识: Java基本语法 类、方法、接口、常量等概念 Web应用基本架构 2. 框架识别 2.1 Struts2框架特征 web.xml 中存在Filter-class为 org.apache.struts2.dispatcher.xxxx resources 或 src 目录下存在 struts.xml 文件 pom.xml 中存在Struts2依赖信息 2.2 SpringMVC框架特征 pom.xml 中存在Spring相关依赖 web.xml 中存在 DispatcherServlet 的注册配置 3. 审计思路 3.1 Struts2框架审计 3.1.1 过滤器及映射配置 web.xml分析 : <filter-mapping> 的 <url-pattern> 决定拦截规则 .action :所有以.action结尾的请求被拦截 /test/.action :仅test目录下的.action请求被拦截 struts.xml分析 : 表示 novy.action.LoginAction 类的 test 方法处理 http://127.0.0.1/test.action 请求 3.1.2 层次结构 Action层 : 业务逻辑处理层 接收视图层(.jsp)请求和参数 调用Model层方法完成业务逻辑 控制程序流程并选择视图 文件特征: XxxAction.java DAO层 : 数据持久层 处理数据库增删查改操作 文件特征: XxxDao.java 3.1.3 审计实例 流程分析 : 请求流程:Action → DAO 其他目录: bean (实体处理)、 db (数据库连接配置) 代码分析 : 查看 web.xml 确定拦截规则 查看 struts.xml 确定Action处理类 跟进处理类(如 GoLogin.java ) 查找参数处理方法(如 checkLogin ) 检查SQL语句拼接情况 漏洞验证 : 构造SQL注入Payload: Admin'or"="or--+ 测试请求路由(如 login.jsp ) 3.2 SpringMVC框架审计 3.2.1 配置分析 web.xml : DispatcherServlet 配置确定SpringMVC作用范围 contextConfigLocation 确定SpringMVC配置文件路径 springmvc.xml : component-scan 查找Controller类位置 InternalResourceViewResolver 自定义视图解析器 pom.xml : 声明项目信息和环境配置 引用组件依赖 判断是否为Maven项目 3.2.2 层次结构 Controller层 : 控制层(业务逻辑) 接收客户端请求 调用Service层业务逻辑 传递数据给视图层 文件特征: XxxController.java 注解示例: Service层 : 业务层 接收Controller数据 与DAO/Mapper层交互 处理业务逻辑 文件特征: XxxService.java (接口定义) Impl层 : 服务实现层 实现Service接口方法 文件特征: XxxImpl.java Mapper层 : 数据持久层 直接操作数据库 文件特征: XxxMapper.xml DAO层 : 数据接口层 处理数据请求(内部实现) Entity层 : 实体处理层 存放实体类 与数据库属性对应 请求处理流程 :Controller → Service → Impl → Mapper 3.2.3 审计实例 组件分析 : 检查 pom.xml 中引用的组件版本 查找已知漏洞组件(如Fastjson) 代码分析 : 全局搜索 @Controller 或 file mask 查看所有Controller 查找参数处理方法(如使用 @RequestBody ) 跟进Service和Mapper实现 检查SQL语句拼接情况(如 %${}% 模糊查询) 漏洞验证 : 根据Controller构造请求URL 测试参数注入点 3.3 特殊情况处理 3.3.1 SQL操作在Service层 某些项目直接在Service层进行SQL查询 检查未使用预编译的SQL语句 3.3.2 接口断点处理 当跟进到接口定义时中断 全局搜索 implements 查找实现类 在实现类中继续审计 4. 审计技巧 4.1 命名规律 请求处理流程中类名前缀通常一致 如: NovyController → NovyService → NovyMapper.xml 不一致命名需特别注意 4.2 方法跟进 使用IDE(如IntelliJ IDEA)的全局搜索和跳转功能 关注类实例化方式: 直接跟进方法实现(Ctrl+左键) 5. 总结 框架识别 是审计第一步,确定框架类型和版本 理解层次结构 有助于快速定位关键代码 参数传递流程 是漏洞挖掘的重点路径 SQL语句拼接 是常见漏洞点 IDE工具 能极大提高审计效率 通过系统性地分析框架配置、代码层次和参数传递,可以有效地发现Java Web应用中的安全漏洞。