
1. 项目概述为什么我们要死磕WebGoat的访问控制漏洞如果你正在学习Web安全或者准备考取像OSCP、OSWE这类注重实战的认证那么WebGoat这个靶场你肯定绕不过去。它就像是安全领域的“新手村”把各种常见的Web漏洞比如SQL注入、XSS、CSRF都做成了一个个可以动手实操的关卡。而今天我们要啃的这块硬骨头是“Broken Access Control”失效的访问控制在OWASP Top 10榜单上常年位居榜首是导致数据泄露最常见的原因之一。简单来说访问控制就是系统用来判断“你是谁”以及“你能干什么”的规则。一个健康的系统应该像公司的门禁普通员工刷工卡只能进办公区而高管有权限进入财务室或机房。失效的访问控制就相当于门禁系统坏了或者有人偷偷复制了高管的门禁卡导致不该进的人进去了不该看的数据被看到了。在WebGoat的Broken Access Control章节里它会模拟几种典型的漏洞场景比如不安全的直接对象引用IDOR、水平越权、垂直越权等让你亲手去发现并利用这些漏洞。我之所以花时间整理这份通关笔记是因为我发现很多教程只给步骤不讲原理。照着做一遍漏洞是复现了但为什么这里要改这个参数Burp Suite里这个功能到底怎么用遇到不一样的情况该怎么排查这些关键问题往往被一笔带过。这份笔记我会结合我自己的踩坑经验不仅告诉你“怎么做”更会拆解清楚“为什么这么做”以及“如果失败了该怎么调”。目标就是让你离开这个靶场后面对真实世界的应用也能具备同样的分析和突破能力。2. 环境准备与靶场初始化工欲善其事必先利其器。在开始挑战之前我们需要一个稳定、可复现的实验环境。这里我强烈建议使用Docker来部署WebGoat它能完美解决版本依赖、环境冲突的问题让你专注于漏洞本身。2.1 使用Docker一键部署WebGoat 8.x目前最稳定且功能完整的版本是WebGoat 8.x。打开你的终端Linux/macOS或PowerShell/CMDWindows执行以下命令docker pull webgoat/webgoat-8.0 docker run -d -p 8080:8080 -p 9090:9090 -e TZAsia/Shanghai --name webgoat8 webgoat/webgoat-8.0命令参数解读-d: 让容器在后台运行。-p 8080:8080: 将容器内的8080端口映射到宿主机的8080端口这是WebGoat的主Web界面。-p 9090:9090: 映射9090端口这是WebWolf一个辅助工具用于接收漏洞利用过程中外带的数据的界面。-e TZAsia/Shanghai: 设置容器时区避免日志时间错乱。--name webgoat8: 给容器起个名字方便后续管理。执行后访问http://localhost:8080/WebGoat就能看到登录页面。首次使用需要注册一个账号注册后登录即可。注意如果8080端口被占用你可以修改命令中的第一个端口号例如-p 8888:8080那么访问地址就变为http://localhost:8888/WebGoat。2.2 核心工具Burp Suite社区版配置Burp Suite是我们进行Web渗透测试的“瑞士军刀”社区版对于学习WebGoat完全够用。下载与启动从PortSwigger官网下载Burp Suite Community Edition。启动后你需要配置浏览器代理。代理设置在Burp中进入Proxy-Options确保代理监听在127.0.0.1:8080这是Burp默认的。然后在你的浏览器以Firefox为例网络设置中手动配置HTTP代理为127.0.0.1端口8080。安装CA证书关键步骤为了让Burp能解密HTTPS流量必须安装其CA证书。在浏览器中访问http://burp或http://127.0.0.1:8080点击 “CA Certificate” 下载证书文件。然后在浏览器的证书管理器中导入该证书并信任它。拦截测试打开浏览器访问任意HTTPS网站如https://example.com查看Burp的Proxy-Intercept标签页如果能看到请求内容说明配置成功。记得在完成敏感操作后关闭浏览器代理或Burp的拦截功能否则无法正常上网。2.3 浏览器与插件准备浏览器推荐使用Firefox或Chrome。Firefox的隐私容器模式能很好隔离不同站点的Cookie在做一些需要多账号切换的挑战时非常有用。插件安装 “FoxyProxy” 插件可以一键切换代理设置比在系统设置里手动修改方便得多。环境搭好了工具也备齐了我们这就进入正题从第一个挑战开始一步步拆解Broken Access Control的奥秘。3. 挑战一不安全的直接对象引用IDOR初探登录WebGoat后在侧边栏找到A10 - Broken Access Control下的子章节通常第一个挑战就是关于“Insecure Direct Object Reference (IDOR)”。IDOR的本质是应用程序在向用户展示或操作资源如文件、数据库记录时直接使用了可预测的标识符如数字ID、文件名且没有在服务端对每次访问进行严格的权限校验。3.1 挑战场景与目标分析典型的场景是你登录后网站通过类似http://target.com/profile?userId12345的URL来显示你的个人资料。这里的userId12345就是一个直接对象引用。如果服务端没有检查“当前登录的用户是否就是userId12345所对应的用户”那么攻击者只需修改这个参数比如改成userId12346就可能看到其他用户的资料。这就是水平越权。在WebGoat的这个挑战里目标通常是让你查看一个不属于你当前账户的“隐藏”属性或另一个用户的资料。页面可能会给你一个链接或按钮点击后显示你自己的信息。你的任务就是通过修改请求参数来访问他人的数据。3.2 利用Burp Suite进行请求拦截与篡改开启拦截确保Burp Suite的Proxy-Intercept处于Intercept is on状态。触发请求回到浏览器在WebGoat页面上点击那个看似只能查看自己资料的按钮或链接。分析请求此时请求会被Burp拦截。在Raw标签页中仔细查看整个HTTP请求。关键信息通常在两个地方URL参数查看GET请求的URL或者POST请求的URL路径寻找像id,userId,file,document这样的参数。请求体如果是POST请求查看Body部分可能以表单形式application/x-www-form-urlencoded或JSON格式application/json包含对象标识符。篡改参数假设你发现参数是userId2342384。你可以尝试进行“遍历”简单递增/递减将值改为2342385或2342383。常见测试值尝试1,0,2,admin,true等。使用Burp的Intruder攻击器对于需要批量测试的情况这是神器。在拦截的请求上右键选择Send to Intruder。在Positions标签页清除所有自动标记然后手动选中参数值如2342384点击Add §将其标记为攻击位置。在Payloads标签页可以设置数字序列、从文件加载字典等。然后点击Start attackBurp会自动替换参数并发送大量请求你只需要在结果中寻找响应状态码不同如200成功403失败或长度不同的请求即可。3.3 实操心得与注意事项不要只改URL有些应用会将标识符放在Cookie、HTTP头如X-User-Id或JSON Body的深处。务必检查整个请求的所有部分。注意请求方法查看GET和修改POST/PUT可能是不同的端点。尝试越权查看后挑战可能会要求你越权修改这时需要将GET请求改为POST/PUT并在Repeater中构造正确的请求体。利用历史记录Burp的Proxy-HTTP history是你最好的朋友。所有经过代理的请求响应都会记录在这里。你可以回顾之前的合法请求分析其结构用于构造新的攻击请求。状态码不是唯一标准有时服务器对所有请求都返回200但在响应Body里用不同的消息提示成功或失败。因此在Intruder攻击时除了关注状态码更要关注响应长度和内容的差异。4. 挑战二基于参数的访问控制绕过这个挑战通常比简单的IDOR更深入一层。它模拟的是一种有缺陷的访问控制逻辑应用程序根据客户端提交的一个参数如isAdminfalse来决定是否展示管理功能而这个参数可以被用户轻易修改。4.1 漏洞原理深度解析想象一个网上银行转账功能。正常的转账请求可能包含fromAccount你的账户toAccount目标账户amount100confirmtrue。服务端应该做的校验是1) 当前登录用户是否拥有fromAccount的权限2)fromAccount余额是否充足。但如果后端代码偷懒只检查了“用户是否登录”和“confirm参数是否为true”那么攻击者就可以通过修改fromAccount参数将别人的账户设为转出账户实现越权转账。在WebGoat中这类挑战往往表现为页面上有一个“升级为VIP”或“访问管理面板”的按钮点击后似乎没什么反应或者提示权限不足。漏洞点就在于这个按钮点击触发的请求中携带了一个决定权限级别的参数。4.2 使用Repeater模块进行精细攻击Burp的Repeater中继器模块允许你对单个HTTP请求进行手动修改、反复发送和观察响应是分析漏洞和构造攻击载荷的绝佳工具。捕获请求使用代理拦截点击功能按钮产生的请求或者从HTTP历史记录中找到它。发送到Repeater右键点击该请求选择Send to Repeater。分析与修改在Repeater的请求窗口中寻找可能控制权限的参数。常见名称有role,access_level,admin,privileged,type。参数值可能是user,admin,0,1,false,true。尝试修改这些值。例如将roleuser改为roleadmin将isAdminfalse改为isAdmintrue。注意数据类型如果后端是强类型语言“true”字符串和true布尔值可能有区别。尝试多种形式1,“1”,“on”,“yes”。发送与观察点击Send按钮观察右侧的响应窗口。成功的响应可能会显示不同的页面内容、返回一个成功标志、或者跳转到管理界面。4.3 常见陷阱与解决方案响应无变化修改参数后响应看起来和之前一样。这可能是因为改错了参数权限控制可能由多个参数共同决定或者隐藏在Cookie或JWT令牌中。前端验证更改在页面上不体现但实际后台操作已执行。检查响应里是否有隐藏的成功消息或者去其他页面看看功能是否已生效例如尝试访问一个只有管理员能看到的页面。需要重登录/刷新某些权限变更需要重新登录或刷新页面才能生效。在修改请求并发送后回到浏览器刷新页面看看。返回403/401错误这说明服务端有基础的权限校验但可能不完整。尝试顺序攻击先用一个合法请求获取有效的会话Cookie或Token然后在另一个请求中复用这个凭证并修改参数。参数污染同时提交两个同名参数如roleuserroleadmin看后端处理哪个。利用开发工具浏览器的开发者工具F12的“网络(Network)”标签页可以捕获到所有请求包括那些可能由前端JavaScript发起的、不易被直接观察到的API请求这里是发现漏洞点的富矿。5. 挑战三水平与垂直越权实战这是Broken Access Control最核心的两种表现形式WebGoat通常会设置专门的关卡来演示。5.1 水平越权同级别用户的资源互访定义用户A能够操作用户B的同级别数据。例如两个普通用户之间A能修改B的个人资料、查看B的订单详情。WebGoat实战挑战可能会给你两个用户tom/cat和jerry/mouse。用tom登录后网站允许你通过userId查看个人资料。你的目标是查看到jerry的资料。攻击步骤用tom登录正常操作触发查看自己资料的请求。在Burp中捕获该请求发现参数如actionviewProfileuserId2342384。你需要找到jerry的userId。如何找信息泄露可能在网站其他地方如用户列表、评论处泄露了jerry的ID。推测/遍历如果ID是连续的可以遍历tom的ID附近的值。这正是我们之前用Burp Intruder做的事情。设定Payload为从2342380到2342390的数字序列发起攻击。差异响应在Intruder的攻击结果中对比每个请求的响应。大多数请求可能返回“用户不存在”或错误页长度较短而成功查询到jerry资料的请求其响应长度和内容会明显不同。找到jerry的userId例如2342385后在Repeater中修改原请求的参数发送即可看到jerry的资料。5.2 垂直越权普通用户获取管理员权限定义低权限用户如普通用户能够执行高权限用户如管理员才能执行的操作。例如普通用户能访问/admin/deleteUser接口。WebGoat实战挑战可能提供一个“修改个人资料”的功能但隐藏了“角色(role)”字段。普通用户的role是“USER”而管理员是“ADMIN”。目标是将自己提升为管理员。攻击步骤捕获修改个人资料的POST请求。请求体可能是一个JSON{username:tom, email:tomexample.com, ...}。在JSON中尝试添加或修改一个role字段将其值设为ADMIN。发送请求。如果后端没有校验当前用户是否有权修改角色那么操作可能成功。验证如何验证是否成功挑战可能会要求你访问一个只有管理员可见的菜单或页面。或者再次查看个人资料看看响应中是否包含了role: ADMIN。5.3 利用Burp Intruder进行自动化模糊测试对于需要遍历大量ID或参数值的场景手动操作效率太低。Burp Intruder的四种攻击模式需要根据场景选择攻击模式适用场景在越权测试中的典型应用Sniper狙击手最常用。对每个攻击位置依次使用Payload列表中的值其他位置不变。测试单个参数如userId的不同值。Battering ram攻城锤对所有攻击位置使用相同的Payload值。同时替换请求中多个位置的同一标识符如将URL和Body中的ID都替换。Pitchfork草叉为每个攻击位置配置独立的Payload列表并平行取用。需要同时测试用户名和密码的组合但越权中较少见。Cluster bomb集束炸弹为每个攻击位置配置独立的Payload列表进行笛卡尔积式组合。同时遍历两个参数的所有可能组合如userId和role。水平越权遍历ID的Intruder配置示例将带有userId2342384的请求发送到Intruder。攻击模式选择Sniper。在Positions标签页确保只有2342384被标记为攻击点前后有§符号。在Payloads标签页选择Payload type为Numbers。设置数字范围例如从2342370到2342390步长为1。开始攻击。在结果表中主要观察Status状态码和Length响应长度两列。找到状态码为200且长度与其他明显不同的行那很可能就是另一个有效用户的ID。6. 挑战四多步骤操作与状态篡改有些访问控制漏洞不会在单一请求中暴露而是存在于一个多步骤的业务流程中。例如一个“密码重置”功能第一步输入邮箱第二步验证安全问题第三步设置新密码。漏洞可能在于完成第二步后系统在会话中标记了“该用户已通过验证”但在第三步设置新密码时没有再次确认当前要重置密码的账户是否是第一步输入的账户。6.1 理解有状态会话中的漏洞WebGoat可能会模拟一个“转账”或“修改其他用户信息”的多步流程。攻击者可以这样利用正常登录自己的账户A开始一个修改自己信息的流程。在某个步骤比如确认修改前利用Burp拦截请求。篡改请求中要修改的目标对象ID从A改为B。继续流程导致最终修改的是用户B的信息。这里的漏洞在于服务端在流程的每个步骤间通过会话Session来跟踪用户和流程状态但在关键的执行步骤没有重新校验“当前操作的对象”是否与“流程发起者”拥有权限关系。6.2 使用Burp Suite的Comparer进行差异分析当你面对一个复杂的多步流程不确定哪个参数是关键时Burp的Comparer对比器工具非常有用。收集样本用两个不同的用户例如用户A和用户B分别完整走一遍流程。在Burp的History中筛选出这两个流程中的所有请求。发送到Comparer分别右键点击用户A和用户B在同一操作步骤的请求选择Send to Comparer - Request。进行对比打开Comparer它会以单词或字节为单位高亮显示两个请求的不同之处。这能帮你快速定位出那些随用户身份变化而变化的参数比如userId、token、session_variable等。这些往往是需要重点测试的篡改目标。测试选择一个差异点在Repeater中尝试用用户A的会话去修改参数为用户B的标识然后发送请求观察是否能越权成功。6.3 实战案例篡改流程中的目标参数假设一个“发表评论”的功能请求如下POST /api/comment HTTP/1.1 ... Content-Type: application/json { “postId”: 1001, “content”: “这是一条评论” “authorId”: 12345 }后端可能通过会话知道当前用户是12345所以它只检查authorId是否与会话中的用户ID匹配。如果匹配就允许发表。攻击攻击者用户ID: 12345正常发表一条评论捕获请求。在Repeater中将authorId修改为另一个用户ID如 67890。发送请求。如果后端校验逻辑有缺陷只校验了会话用户是否有权发表但没有校验authorId是否属于该用户那么这条评论就会以用户67890的名义发布造成冒充。7. 问题排查与调试技巧实录即使跟着教程做你也可能会卡住。下面是我在通关过程中遇到的一些典型问题及解决方法。7.1 常见错误与解决方案速查表问题现象可能原因排查步骤与解决方案无法连接到WebGoat1. Docker容器未启动。2. 端口映射错误或被占用。3. 防火墙阻止。1.docker ps查看容器状态docker start webgoat8启动。2.docker logs webgoat8查看日志。修改运行命令的端口号。3. 检查主机防火墙/安全组设置。Burp无法拦截流量1. 浏览器代理未设置或设置错误。2. Burp代理监听未开启。3. 系统或杀软有冲突。1. 确认浏览器代理指向127.0.0.1:8080。2. 确认BurpProxy - Intercept为开启状态Options中监听器存在且启用。3. 尝试关闭其他代理软件或杀毒软件的网络防护。HTTPS网站显示证书错误Burp的CA证书未正确安装或信任。1. 确保已从http://burp下载证书。2. 在浏览器证书管理器如Firefox的选项-隐私与安全-证书-查看证书-证书机构-导入中正确导入并勾选“信任使用此CA标识的网站”。修改参数后响应无变化1. 前端有JavaScript验证。2. 改错了参数或位置。3. 操作需要其他条件如Token。4. 成功但无视觉反馈。1. 在开发者工具控制台查看是否有JS报错。尝试直接发送请求绕过前端。2. 用Comparer对比不同操作的请求找出关键参数。3. 检查请求是否缺少必要的Cookie、CSRF-Token等。4. 查看响应Body的原始内容或去其他相关页面验证操作是否生效。Intruder攻击结果全是相同长度/状态码1. Payload设置错误未成功替换。2. 目标参数对Payload不敏感。3. 服务器对错误统一处理。1. 检查Positions标签页参数是否被正确标记有§符号。2. 尝试使用更广的Payload范围或不同类型数字、字典。3. 在Settings标签页启用Grep - Extract提取响应中特定字符串如“成功”、“错误”进行匹配。7.2 高级调试利用Logger和ExtenderLogger日志记录器位于Burp的Extender - Logger标签页。它可以记录Burp所有模块产生的请求和响应包括Repeater、Intruder、Scanner等。当你在多个工具间切换测试时Logger提供了一个统一的视图来查看所有流量方便回溯和分析。Extender扩展你可以安装社区开发的扩展来增强Burp功能。例如AuthMatrix扩展可以帮助测试授权漏洞JSON Web Tokens扩展可以方便地解码和篡改JWT令牌。虽然WebGoat基础挑战不一定需要但了解这些工具能为应对更复杂场景做准备。7.3 思维拓展从靶场到真实世界在WebGoat里漏洞点往往比较明显。但在真实渗透测试或安全评估中你需要更系统地寻找访问控制漏洞枚举功能点使用爬虫如Burp的Target - Site map或手动浏览列出所有已登录用户可访问的URL和功能。识别参数对每个功能点分析其请求识别所有用户可控的输入点URL参数、POST数据、Cookie、Headers。测试篡改对每个可控输入点系统性地测试其是否可用于指向其他资源IDOR或提升权限。流程跳步对于多步操作尝试跳过中间步骤直接访问最终的执行端点。平行测试准备两个不同权限的账号如普通用户A、普通用户B、管理员C。用A账号操作尝试访问或修改B的资源水平越权。用A账号操作尝试执行C的功能垂直越权。通关WebGoat的Broken Access Control章节绝不仅仅是点几下鼠标、改几个参数。它训练的是一种“以攻击者视角审视系统权限逻辑”的思维模式。每一次拦截、每一次篡改、每一次对比都是在问系统一个问题“你究竟凭什么判断这是我该做的事” 当你养成了这种思维习惯你会发现失效的访问控制漏洞在现实中无处不在而你的任务就是让它们无处遁形。