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.xxxxresources或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分析:
<action name="test" method="test" class="novy.action.LoginAction"/>
表示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)
- 构造SQL注入Payload:
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 - 注解示例:
@Controller @RequestMapping(value = "/novy")
-
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)的全局搜索和跳转功能
- 关注类实例化方式:
private EntityManager em; // 使用EntityManager接口 - 直接跟进方法实现(Ctrl+左键)
5. 总结
- 框架识别是审计第一步,确定框架类型和版本
- 理解层次结构有助于快速定位关键代码
- 参数传递流程是漏洞挖掘的重点路径
- SQL语句拼接是常见漏洞点
- IDE工具能极大提高审计效率
通过系统性地分析框架配置、代码层次和参数传递,可以有效地发现Java Web应用中的安全漏洞。