用途
本技能面向安全测试人员,用于系统性地发现和验证 MFA / 2FA(多因素 / 双因素认证)绕过漏洞。MFA 绕过是一类不断增长的漏洞类型,当它能在攻击者没有既有会话的情况下实现账户接管(ATO)时,通常被评为 High 或 Critical。技能归纳了 7 种不同的绕过模式,并给出对应的测试手法。
主要能力(7 种模式)
模式 1:OTP 无速率限制 使用 ffuf 遍历全部 100 万个 6 位验证码。示例命令:
ffuf -u "https://target.com/api/verify-otp" \
-X POST -H "Content-Type: application/json" \
-H "Cookie: session=YOUR_SESSION" \
-d '{"otp":"FUZZ"}' \
-w <(seq -w 000000 999999) \
-fc 400,429 -t 5
其中 -t 5 用于放慢速度,过于激进的速率会触发 429 或封禁。
模式 2:OTP 使用后未失效
- 登录 → 收到 OTP "123456" → 输入 → 成功;
- 登出 → 用相同凭据再次登录;
- 再次尝试 OTP "123456";
- 若被接受,说明 OTP 从未失效,攻击者嗅探一次即可永久复用,构成 ATO。
模式 3:响应篡改
- 输入错误 OTP → 在 Burp 中捕获响应;
- 将
{"success":false}改为{"success":true}(或将 401 改为 200); - 转发 → 若应用继续执行,说明 MFA 检查仅在客户端。
模式 4:跳过 MFA 步骤(工作流绕过) 输入密码后,应用会设置一个 "pre-mfa" cookie 并重定向到 /mfa。测试时直接跳过 /mfa,用 pre-mfa cookie 访问 /dashboard:
curl -s -b "session=PRE_MFA_SESSION" https://target.com/dashboard
若应用在未完成 MFA 的情况下授予访问权限,即为认证流程绕过,属 Critical。
模式 5:MFA 验证竞态 使用 asyncio 与 aiohttp 同时提交同一 OTP:
import asyncio, aiohttp
async def verify(session, otp):
async with session.post("https://target.com/api/mfa/verify",
json={"otp": otp}) as r:
return r.status, await r.text()
async def race():
cookies = {"session": "YOUR_SESSION"}
async with aiohttp.ClientSession(cookies=cookies) as s:
results = await asyncio.gather(verify(s, "123456"), verify(s, "123456"))
print(results)
asyncio.run(race())
模式 6:备用码暴力破解 备用码通常为 8 位字母数字(36^8 ≈ 2.8 万亿,过大);但需检查备用码是否仅为 6-8 位数字(100 万至 1000 万范围,在无速率限制下可行)。同时测试:备用码耗尽后能否复用;部分应用的备用码是否可预测地重新生成。
模式 7:"记住此设备"信任提升
- 在设备 A(攻击者浏览器)完成一次 MFA;
- 捕获 "remember device" cookie;
- 从新 IP / 浏览器提交该 cookie;
- 若 MFA 被跳过,说明设备信任未绑定 IP / UA,可从任意位置实现 ATO。
严重性判定
- 速率限制绕过 + 无锁定 = ATO(Critical)
- 响应篡改 = 仅客户端检查 = Critical
- 跳过 MFA 步骤 = 认证流程绕过 = Critical
- OTP 复用 = 持久会话劫持 = High
相关技能与链式组合
- hunt-ato:MFA 绕过是原语,ATO 是目标。链式原语:cookie 窃取(经 XSS 或会话固定)+ 密码预言机(登录响应时间 / 长度差异泄露有效密码且无锁定)+ 密码修改端点无 MFA 升级 = 持久 ATO,无需面对 OTP 挑战 → 密码被轮换,攻击者将受害者锁在门外。
- hunt-race-condition:模式 5(OTP 竞态)属于竞态条件领域,应同时加载两个技能。链式原语:同一 6 位 OTP 通过 20 条并行 HTTP/2 流(单包 Turbo Intruder 攻击)在服务器标记其已使用前提交 → 1 次成功 + 19 次 "already-used" → 竞态窗口确认 → 攻击者无需暴力,只需猜一次并并行化 → ATO。
- hunt-auth-bypass:跳过 MFA 步骤是工作流层的认证流程绕过。链式原语:密码步骤后签发 pre-MFA cookie + 直接导航到 /dashboard 跳过 /mfa 路由 + 服务器仅对 /mfa 而非 /dashboard 做中间件门控 = 从仅密码状态获得完整认证后访问 → 因路由门控位置错误,MFA 从未被强制执行。
- hunt-misc:经 /api/me 泄露恢复码属于杂项类信息泄露,链式后变为 Critical。链式原语:/api/me 返回完整用户对象,包含 backup_codes 数组(明文、从不轮换)→ 拥有任意读取型 IDOR 或 XSS 的攻击者窃取备用码 → 使用一个备用码 → 满足 MFA → 在不知 OTP 的情况下实现 ATO。
- security-arsenal:当 "MFA satisfied" 声明存在于可伪造的 JWT 声明中时,取用 OTP 暴力破解载荷部分(000000-999999 字典生成器、带
-t 5 -p 0.5-2的 ffuf 速率限制规避模式、经 proxychains 的分布式 IP 轮换)以及 JWT 令牌重放表。 - triage-validation:在仅当攻击者已持有密码时才生效的 MFA 绕过上声称 Critical 之前,先运行 Pre-Severity Gate。独立的 MFA 绕过为 High;与密码预言机链式为 Critical;仅与 cookie 窃取链式也为 Critical。链式问题是区分二者的关键。
适用场景与限制
适用于授权范围内的安全测试与漏洞赏金场景,用于验证目标应用的 MFA 实现是否存在上述 7 类缺陷。使用时应控制请求速率以避免触发封禁,并注意仅在合法授权下进行测试。资料未提供该技能的安装方式、收费信息或具体平台支持范围。