以AJ-Report为例从0开始学习Java代码审计
字数 1432 2025-08-20 18:17:53
AJ-Report Java代码审计从0开始学习指南
1. 审计环境准备
1.1 基础工具配置
- IDE选择:PyCharm/IntelliJ IDEA(建议使用IntelliJ IDEA进行Java审计)
- Java环境:JDK 8+(推荐JDK 11)
- 构建工具:Maven 3.6+
- 调试工具:Arthas、JD-GUI、JADX
1.2 项目导入步骤
- 克隆AJ-Report源码仓库
- 使用Maven导入项目依赖
- 配置数据库连接(MySQL 5.7+)
- 启动项目并验证基础功能
2. 项目结构分析
2.1 核心目录结构
src/main/java/com/anji/plus/
├── gaea
│ ├── core // 核心框架代码
│ ├── exception // 异常处理
│ ├── security // 安全相关
│ └── util // 工具类
├── report
│ ├── controller // 控制器层
│ ├── service // 服务层
│ ├── dao // 数据访问层
│ └── entity // 实体类
└── config // 配置类
2.2 常见问题解决
- com.anji.plus.gaea..module..dao飘红问题:
- 检查Maven依赖是否完整
- 确认子模块是否被正确导入
- 执行
mvn clean install重新构建 - 检查IDE的Maven配置是否正确
3. 代码审计核心要点
3.1 SQL注入审计
-
MyBatis审计重点:
- 检查XML映射文件中
${}的使用 - 审计动态SQL拼接(
<if>,<foreach>等标签) - 验证参数是否使用
#{}预编译
- 检查XML映射文件中
-
JPA审计重点:
- 检查
@Query注解中的原生SQL - 审计
JpaRepository自定义方法实现 - 验证
Specification构建的查询条件
- 检查
3.2 XSS漏洞审计
-
输入输出审计:
- 检查Controller层参数是否使用
@RequestBody/@RequestParam - 验证返回数据是否经过转义(如使用Thymeleaf的
th:text)
- 检查Controller层参数是否使用
-
响应头检查:
- 确认是否设置
X-XSS-Protection - 检查
Content-Type是否正确(避免text/html)
- 确认是否设置
3.3 权限控制审计
-
Spring Security配置:
- 检查
WebSecurityConfigurerAdapter配置 - 验证URL权限控制是否完善
- 审计
@PreAuthorize注解使用情况
- 检查
-
功能权限审计:
- 检查关键操作是否进行权限验证
- 审计越权访问风险(水平/垂直越权)
4. 典型漏洞案例分析
4.1 未授权访问漏洞
// 错误示例:缺少权限注解
@GetMapping("/api/report/export")
public void exportReport(HttpServletResponse response) {
// 导出报表逻辑
}
// 修复方案:添加权限控制
@PreAuthorize("hasRole('REPORT_EXPORT')")
@GetMapping("/api/report/export")
public void exportReport(HttpServletResponse response) {
// 导出报表逻辑
}
4.2 SQL注入案例
// 错误示例:使用字符串拼接SQL
@Query(value = "SELECT * FROM report WHERE name = '" + "#{name}" + "'", nativeQuery = true)
List<Report> findByName(String name);
// 修复方案:使用参数化查询
@Query(value = "SELECT * FROM report WHERE name = ?1", nativeQuery = true)
List<Report> findByName(String name);
4.3 文件上传漏洞
// 错误示例:未校验文件类型和内容
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
String fileName = file.getOriginalFilename();
file.transferTo(new File("/uploads/" + fileName));
return "success";
}
// 修复方案:添加安全检查
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
// 校验文件类型
String contentType = file.getContentType();
if(!ALLOWED_TYPES.contains(contentType)) {
throw new IllegalArgumentException("Invalid file type");
}
// 校验文件内容
byte[] bytes = file.getBytes();
if(!isSafeContent(bytes)) {
throw new IllegalArgumentException("Malicious content detected");
}
// 使用随机文件名
String fileName = UUID.randomUUID() + getExtension(file.getOriginalFilename());
file.transferTo(new File("/uploads/" + fileName));
return "success";
}
5. 审计工具链推荐
-
静态分析工具:
- SpotBugs(查找常见编码问题)
- Dependency-Check(依赖安全检查)
- Semgrep(自定义规则扫描)
-
动态分析工具:
- Burp Suite(接口测试)
- OWASP ZAP(自动化扫描)
- JMeter(压力测试)
-
代码审计辅助:
- CodeQL(高级语义分析)
- Find Security Bugs(安全漏洞扫描)
6. 审计报告编写要点
-
漏洞描述:
- 清晰说明漏洞类型和位置
- 提供完整的请求/响应示例
-
风险评级:
- 根据CVSS标准评估风险等级
- 说明漏洞可能造成的影响
-
修复建议:
- 提供具体的代码修复方案
- 建议的安全配置调整
7. 持续学习资源
-
官方文档:
- OWASP Top 10
- Spring Security官方文档
- MyBatis安全指南
-
实战平台:
- OWASP WebGoat
- DVWA
- Juice Shop
-
社区资源:
- 奇安信攻防社区
- 先知社区
- Seebug Paper
通过系统性地按照上述步骤进行审计,可以全面发现AJ-Report项目中的安全问题,并为其他Java项目的代码审计提供参考框架。