记一次对某系统的审计(Java审计)
字数 1687 2025-08-05 08:19:01
Java Web应用安全审计实战教学文档
1. 审计概述
本次审计对象是一个基于Spring框架开发的建站系统,通过分析发现了多个安全漏洞,包括XSS、任意文件上传、逻辑漏洞(越权)和未授权访问等问题。
2. 审计发现的安全漏洞及分析
2.1 XSS漏洞
漏洞位置:XxxxxController.Class
漏洞代码:
String callback = request.getParameter("callback");
jsonStr = ";" + callback + "(" + result.toString() + ")";
out.write(jsonStr);
漏洞分析:
- 直接从
request.getParameter获取callback参数 - 未进行任何过滤或编码处理
- 直接通过
out.write输出到前端 - 攻击者可构造恶意callback参数执行任意JavaScript代码
修复建议:
- 对输出内容进行HTML编码
- 使用ESAPI等安全库进行XSS防护
- 设置Content-Type头为
application/json
2.2 任意文件上传漏洞
漏洞位置:XxxxxController.Class → module.tipOffService.saveTipOff
漏洞代码:
String path2 = Utils.uploadFile(video, String.valueOf(hdjlPath) + "/tipOff/video");
if (Utils.isNotNullOrEmpty(tipOff.getVideo())) {
File file2 = new File(String.valueOf(SystemParamConfigUtil.getParamValueByParam("zdzyUploadPath")) + tipOff.getVideo());
if (file2.exists()) {
file2.delete();
}
}
tipOff.setVideo(path2);
漏洞分析:
- 上传功能未对文件后缀名进行校验
- 未限制上传文件类型
- 攻击者可上传恶意文件(如.jsp、.php等)
- 可能导致服务器被植入webshell
修复建议:
- 白名单方式限制可上传文件类型
- 对上传文件重命名
- 文件存储在非web目录
- 设置文件权限为不可执行
2.3 逻辑漏洞(越权删除纠错信息)
漏洞位置:XxxxxController.Class → recoveryService.deleteRecovery
漏洞分析:
- 控制器未进行权限校验
- 任意用户可调用删除功能
- 虽然使用
${id}防止了SQL注入,但存在越权问题 - 攻击者可删除任意纠错信息
修复建议:
- 添加权限校验注解(如
@PreAuthorize) - 实现业务层权限检查
- 记录操作日志
2.4 未授权访问漏洞
漏洞位置:XxxxxController.Class
漏洞分析:
- 未对管理员信息查询接口进行权限控制
- 以XML形式将管理员信息输出到HTML页面
- 导致敏感信息泄露
修复建议:
- 添加权限控制
- 敏感信息脱敏处理
- 限制接口访问权限
3. 审计方法论
3.1 审计流程
-
入口分析:
- 检查web.xml中的Servlet配置
- 分析全局安全过滤器
- 确定路由规则(本例为Controller/方法名.do)
-
代码审计:
- 定位关键Controller类
- 跟踪敏感操作调用链
- 检查参数处理和输出编码
-
漏洞验证:
- 构造测试用例
- 验证漏洞可利用性
- 评估漏洞影响范围
3.2 重点关注点
-
输入输出处理:
request.getParameter()直接使用- 输出未编码(
out.write) - JSONP回调处理
-
文件操作:
- 文件上传逻辑
- 文件路径拼接
- 文件删除操作
-
权限控制:
- 缺失的权限校验
- 越权操作
- 敏感信息暴露
4. 安全开发建议
4.1 通用防护措施
-
输入验证:
- 所有输入视为不可信
- 实施白名单验证
- 使用OWASP ESAPI等安全库
-
输出编码:
- 根据输出上下文进行编码(HTML/JS/URL等)
- 设置正确的Content-Type
-
权限控制:
- 最小权限原则
- 方法级权限注解
- 业务逻辑权限校验
4.2 Spring安全配置
- 启用CSRF防护:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // 错误示例,应该启用
}
- 配置安全头:
http.headers()
.contentSecurityPolicy("script-src 'self'")
.and()
.xssProtection()
.and()
.frameOptions().sameOrigin();
- 方法安全:
@PreAuthorize("hasRole('ADMIN')")
public void deleteRecovery(String id) {
// ...
}
5. 工具推荐
-
静态分析工具:
- FindSecBugs
- SonarQube
- Fortify
-
动态测试工具:
- OWASP ZAP
- Burp Suite
- Postman
-
开发辅助工具:
- OWASP Dependency Check(依赖检查)
- Git Secrets(防止密钥泄露)
- Checkstyle(代码规范检查)
6. 总结
本次审计揭示了Java Web应用中常见的安全问题,包括:
- 缺乏输入输出安全处理导致的XSS
- 文件上传功能缺失安全控制
- 权限校验不完善导致的越权
- 敏感接口未授权访问
开发人员应建立安全开发意识,遵循安全编码规范,实施纵深防御策略,定期进行安全审计和渗透测试,确保应用安全性。