WebGoat A1
Broken Access Control
Hijack a session
题目界面:
Cookie 用于会话管理。用户登录成功后服务器返回 Session ID,浏览器将其保存在 JSESSIONID 等 Cookie 中,后续请求携带该 Cookie 即可免密认证。
首次请求可见服务器返回 Set-Cookie:
后续请求自动附带 Cookie:
多次请求并将 POST 参数 hijack_cookie 置空,观察 Set-Cookie 递增规律:前半段每次 +1 或 +2,后半段为 Unix 时间戳递增。猜测空洞的 id 槽位对应其他会话,可据此爆破。
示例:若上一轮 hijack_cookie 为 4794214301343365167-1765189829927,下一轮为 4794214301343365169-1765189833485,取前半段末两位中间值 68,后半段取时间戳中间值,从 29927 到 33485 逐个递增爆破,并发设为 1 防止 500。
爆破配置:
第一次尝试即成功:
源代码显示:cookie 为空则调用 setCookie,非空则校验 session 返回 success:
Cookie 生成逻辑在请求时执行 ++id 并拼接当前时间,因此缺失的 id 表示其他会话。复用对应时间即可成功登录:
Insecure Direct Object References
登录后查看 profile:
抓包发现响应中还包含两个属性:

请求访问的 URL:
直接拼接访问可越权读取:
第五关要求查看并修改他人 profile:
同样枚举 userId(如 300-500),很快找到用户 Bill:
使用 PUT 更新,添加头 Content-Type: application/json,构造完整 JSON 属性并发送:
启示:避免直接暴露内部标识符,做好权限校验和访问控制。
Missing Function Level Access Control
区别:IDOR 属于“水平”越权;缺少函数级别访问控制暴露隐藏功能。
第二题:在 HTML 中找到被 CSS 隐藏的菜单项,去掉 visibility 隐藏即可:
第三题:点击 Admin -> Users 触发 GET,修改路径和 Content-Type 可获取 Jerry 的 Hash(直接点击请求 users-admin-fix 可能是小 bug):
最后一题:先 POST 创建一个 admin 权限账户,用户名需与当前登录账户相同(后端只检查用户名):

源代码显示 users-admin-fix 增加了用户名检查,而 POST 无任何校验,风险极大:

Spoofing an Authentication Cookie
Cookie 用于识别用户,若算法弱或无过期/轮换,易受 MITM 与 XSS 影响。需安全生成并设置过期时间、频繁更新。
题目获得两个 Cookie:
Set-Cookie: spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZhNGM3NDYxNmY2NzYyNjU3Nw==;Set-Cookie: spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZhNGM2ZTY5NmQ2NDYx;
两串均为 Base64。解码为十六进制再转 UTF-8 得到 IPdxjOTQjLtaogbew 与 IPdxjOTQjLnimda,末尾分别是 webgoat 与 admin 的反转。替换为 tom 后再按原流程编码:spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZBNEM2RDZGNzQ=,发送报文登录成功:
源代码:用户名转十六进制再 Base64,额外加盐拼接,盐值作用不大:
