WebGoat_身份认证绕过
字数 1172 2025-08-18 11:35:36
WebGoat 身份认证绕过漏洞分析与实战教学
漏洞概述
本教学文档基于 WebGoat 靶场中的身份认证绕过漏洞(Auth Bypass)进行详细分析,涵盖漏洞原理、实战利用和代码审计三个核心部分。
漏洞利用实战
基本利用步骤
-
初始尝试:
- 首先输入错误的答案,观察系统错误回显
- 确认存在身份验证机制
-
抓包修改:
- 使用代理工具(如 Burp Suite)拦截请求
- 修改请求中的安全问答字段:
- 将
secQuestion0改为secQuestion3 - 将
secQuestion1改为secQuestion4
- 将
- 重新发送修改后的请求
-
结果验证:
- 系统返回验证成功页面
- 可以绕过身份验证修改密码
代码审计分析
前端代码
- 文件路径:
BOOT-INF/classes/lessons/authbypass/html/AuthBypass.html - 主要功能:提供用户界面和收集用户输入
后端代码
- 主验证文件:
BOOT-INF/classes/org/owasp/webgoat/lessons/authbypass/VerifyAccount.class - 辅助验证文件:
BOOT-INF/classes/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.class
关键代码逻辑
-
数据接收:
- 接收前端传来的验证数据
- 主要关注包含
secQuestion字符串的字段
-
验证流程:
// 将请求中所有secQuestion字段存入哈希表 Map<String, String> submittedQuestions = parseSecQuestions(request); // 第一重验证 if (submittedQuestions.size() == expectedAnswers.size()) { // 检查secQuestion0和secQuestion1是否存在且值正确 if (submittedQuestions.containsKey("secQuestion0") && submittedQuestions.get("secQuestion0").equals(expectedAnswers.get("secQuestion0")) && submittedQuestions.containsKey("secQuestion1") && submittedQuestions.get("secQuestion1").equals(expectedAnswers.get("secQuestion1"))) { return true; } return false; } // 第二重验证(漏洞所在) else { // 检查secQuestion0是否存在且值不正确 if (submittedQuestions.containsKey("secQuestion0") && !submittedQuestions.get("secQuestion0").equals(expectedAnswers.get("secQuestion0"))) { return false; } // 关键漏洞点:只要不包含secQuestion1或值正确就返回true else { return (!submittedQuestions.containsKey("secQuestion1") || submittedQuestions.get("secQuestion1").equals(expectedAnswers.get("secQuestion1"))); } }
漏洞原理详解
-
验证逻辑缺陷:
- 系统使用两重验证机制
- 第一重验证检查字段数量和特定字段(secQuestion0/secQuestion1)的正确性
- 第二重验证存在逻辑缺陷,当字段数量匹配但字段名不同时,会进入错误的分支
-
绕过机制:
- 通过修改字段名(如改为secQuestion3/secQuestion4)使字段数量匹配
- 由于不包含secQuestion0字段,跳过第一个if判断
- 进入else分支后,由于不包含secQuestion1字段,
!submittedQuestions.containsKey("secQuestion1")返回true,导致整个验证通过
防御建议
-
代码层面:
- 严格验证所有安全问答字段的名称和值
- 移除存在逻辑漏洞的验证分支
- 实现统一的验证逻辑,避免多条件分支
-
架构层面:
- 采用标准的身份验证框架
- 实现服务端会话管理而非依赖客户端参数
-
安全测试:
- 进行充分的边界测试,包括异常字段名测试
- 实施自动化安全扫描,检测逻辑漏洞
总结
本漏洞展示了身份验证机制中逻辑缺陷导致的严重安全问题。通过精心构造的请求参数,攻击者可以完全绕过身份验证流程。这强调了在安全关键代码中需要严格验证所有输入参数,并避免复杂的条件分支逻辑。