Broken Access Control

Hijack a session

题目界面:Hijack a session

Cookie 用于会话管理。用户登录成功后服务器返回 Session ID,浏览器将其保存在 JSESSIONID 等 Cookie 中,后续请求携带该 Cookie 即可免密认证。

首次请求可见服务器返回 Set-Cookie第一次请求

后续请求自动附带 Cookie:后续请求

多次请求并将 POST 参数 hijack_cookie 置空,观察 Set-Cookie 递增规律:前半段每次 +1 或 +2,后半段为 Unix 时间戳递增。猜测空洞的 id 槽位对应其他会话,可据此爆破。

示例:若上一轮 hijack_cookie4794214301343365167-1765189829927,下一轮为 4794214301343365169-1765189833485,取前半段末两位中间值 68,后半段取时间戳中间值,从 2992733485 逐个递增爆破,并发设为 1 防止 500。

爆破配置:fuzzer

第一次尝试即成功:爆破成功

源代码显示:cookie 为空则调用 setCookie,非空则校验 session 返回 successsource code

Cookie 生成逻辑在请求时执行 ++id 并拼接当前时间,因此缺失的 id 表示其他会话。复用对应时间即可成功登录:source code


Insecure Direct Object References

登录后查看 profile:登录用户

抓包发现响应中还包含两个属性:profile response

请求访问的 URL:request

直接拼接访问可越权读取:Q4

第五关要求查看并修改他人 profile:Q5

同样枚举 userId(如 300-500),很快找到用户 Bill:Bill

使用 PUT 更新,添加头 Content-Type: application/json,构造完整 JSON 属性并发送:PUT

启示:避免直接暴露内部标识符,做好权限校验和访问控制。


Missing Function Level Access Control

区别:IDOR 属于“水平”越权;缺少函数级别访问控制暴露隐藏功能。

第二题:在 HTML 中找到被 CSS 隐藏的菜单项,去掉 visibility 隐藏即可:inspector

第三题:点击 Admin -> Users 触发 GET,修改路径和 Content-Type 可获取 Jerry 的 Hash(直接点击请求 users-admin-fix 可能是小 bug):GET

最后一题:先 POST 创建一个 admin 权限账户,用户名需与当前登录账户相同(后端只检查用户名):创建用户 获取hash

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


Cookie 用于识别用户,若算法弱或无过期/轮换,易受 MITM 与 XSS 影响。需安全生成并设置过期时间、频繁更新。

题目获得两个 Cookie:

  • Set-Cookie: spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZhNGM3NDYxNmY2NzYyNjU3Nw==;
  • Set-Cookie: spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZhNGM2ZTY5NmQ2NDYx;

两串均为 Base64。解码为十六进制再转 UTF-8 得到 IPdxjOTQjLtaogbewIPdxjOTQjLnimda,末尾分别是 webgoatadmin 的反转。替换为 tom 后再按原流程编码:spoof_auth=NmM1MDY0Nzg2YTRmNTQ1MTZBNEM2RDZGNzQ=,发送报文登录成功:success

源代码:用户名转十六进制再 Base64,额外加盐拼接,盐值作用不大:set-cookie encode