☰
Decepticon OAuth / OIDC 攻击手册:redirect_uri 绕过、State CSRF 与账户接管(ATO)链全解析
2026/10/14 17:53:40 网站建设 项目流程

【免费下载链接】Decepticon

Autonomous Hacking Agent for Red Team

项目地址:https://gitcode.com/gh_mirrors/de/Decepticon
点击查看免费下载

OAuth 2.0 / OIDC 配置缺陷是现代 Web 应用中最高价值、最常见的账户接管(Account Takeover,ATO)向量。本文以 Decepticon 仓库中packages/decepticon/decepticon/skills/standard/exploit/web/oauth/SKILL.md为主体,系统梳理 OAuth/OIDC 授权码流的测绘方法、十大攻击面(redirect_uri 绕过、state CSRF、PKCE 降级、code 复用、Referer 泄漏、scope 注入、response_type 混淆、client_id 混淆、ATO 链、账户关联漏洞),并给出工具选型、PoC 流程、严重度校准与防御清单。读完本文,你将能对目标 OAuth 流程执行系统化测绘、验证各参数校验是否可绕过,并把单一缺陷升级为可交付的完整 ATO PoC。

说明:Decepticon 将该技能归类为authentication子域,对应 MITRE ATT&CK T1528(窃取应用访问令牌)与 T1212(利用软件配置错误/条件缺陷)。技能 Frontmatter 中的when_to_use触发词为oauth oidc authorization_code redirect_uri client_id state pkce,即当任务目标涉及这些关键词时,Agent 应通过load_skill加载本技能。

1. 技能在 Decepticon 中的定位与加载方式

在 Decepticon 的 Skill 体系里,OAuth 技能位于标准 Web 攻击技能树中:

packages/decepticon/decepticon/skills/standard/exploit/web/oauth/SKILL.md

其上层路由技能 web/SKILL.md 是"路由型"技能:先帮助 Agent 判断攻击类型,再引导其加载对应子技能。该路由表中对 OAuth 的判定规则为:当侦察结果出现/oauth/authorize、/oauth/callback、response_type=code|token、client_id=等参数时,应加载oauth子技能。

技能的加载机制由 middleware/skills.py 中的SkillsMiddleware实现:它把技能目录按metadata.subdomain(如authentication、redirect)分组渲染进系统提示词,并将每条技能以"描述 + MITRE ATT&CK 编号 +when_to_use触发词 +load_skill(".../SKILL.md")路径"的形式呈现给 Agent。实际加载由 tools/skills.py 中build_load_skill_tool构造的load_skill工具完成——该工具支持精确路径(/skills/standard/exploit/web/oauth/SKILL.md)、相对路径或唯一 slug(如oauth),并会剥离 YAML Frontmatter 后返回完整技能正文。

因此,本文介绍的所有流程在 Decepticon 中都是可执行的:当 Agent 的目标与 OAuth 触发词匹配时,应先load_skill本手册,再按其中步骤行动——这正对应中间件中强调的SKILL-FIRST RULE(技能先于记忆)。

2. 第 1 步:测绘 OAuth 授权流(Map the flow)

在对任何目标展开 OAuth 攻击前,必须先把授权码流的每一个环节摸清。技能给出的发现命令如下:

# Discovery curl -s https://target/.well-known/openid-configuration | jq

该 OIDC 发现端点会返回授权端点、令牌端点、用户信息端点、JWKS 端点等关键信息。需要识别的关键端点包括:

端点作用
/authorize承载redirect_uri、client_id、scope等关键参数
/token用 code 交换 access_token / id_token
/userinfo返回用户声明(claims)
/jwks.json签名公钥(配合 jwt/SKILL.md 使用)
/revoke令牌吊销端点,有时权限过宽

完成端点测绘后,应在 Burp 中完整捕获一次正常授权流程,并记录以下参数:client_id、redirect_uri、state、scope、response_type、code_challenge(PKCE)。这些参数正是后续每个攻击面的"靶心"——建议将一次正常流程的完整请求序列保存为 Burp Repeater / Intruder 的基础模板。

3. 十大攻击面详解

3.1 redirect_uri 绕过(第 1 优先级)

这是 OAuth 漏洞中最高频的类别,根因是服务端对redirect_uri的校验采用过宽的 allowlist 正则。技能给出了完整的绕过手法对照表:

Bypass示例
Path appendhttps://target.com/callback/../../evil
Subdomain wildcardhttps://target.com.evil.com/cb(服务端匹配*.target.com)
Userinfo trickhttps://target.com@evil.com/cb
Path-traversal in fragmenthttps://target.com/cb#@evil.com
Open-redirect chainredirect_uri=https://target.com/known-redirect?to=evil.com
Localhost / loopbackredirect_uri=http://localhost:1337(常被放行)
data:URIredirect_uri=data:text/html,<script>...(少见但破坏力极大)
Mixed-protocol应要求https://处接受http://
URL-encoded slashhttps://target.com%2Fcallback%2F@evil.com
Different fragment behaviorredirect_uri=https://evil.com#https://target.com/cb

全部都要测。系统化做法是paramspider采集参数 + Burp Intruder 携带绕过 payload 列表进行批量验证。验证成功的判据是:授权端点对被攻击者控制的redirect_uri返回 302 跳转,且 code 出现在跳转 URL 的 query 中。

3.2 state 参数缺失 / 弱随机(CSRF)

state的作用是把本次授权请求绑定到发起它的用户会话上。缺失或可预测的 state 会导致经典的Login CSRF:攻击者在自己浏览器中发起 OAuth 流程,把授权 URL 发给受害者,受害者点击后,攻击者的账户被关联到受害者的身份上。

GET /authorize?response_type=code &client_id=... &redirect_uri=https://target.com/cb &state= ← empty or predictable

测试时重点关注:state 是否为空、是否与会话绑定、是否可预测(时间戳、递增序列、固定值)。

3.3 PKCE 降级

公开客户端(移动端 App、SPA)按规范应当强制使用 PKCE(Proof Key for Code Exchange)。如果服务端在应要求 PKCE 的流程中接受了code_verifier缺失,攻击者就能用窃取的 code 直接完成交换:

POST /token client_id=mobile-app code=<stolen_code> # Note: no code_verifier sent

部分服务端在 PKCE 缺失时静默回退到非 PKCE 流程,导致被窃取的 code 顺利兑换令牌。验证方法:抓取一次正常 PKCE 流程中的 code,然后在令牌请求中省略code_verifier,观察是否仍返回 access_token。

3.4 code 复用 / 重放

规范要求授权码只能兑换一次,兑换后应立即失效。若服务端未在首次交换后作废 code,攻击者可通过 Referer 泄漏、IDOR 或日志抓取拿到受害者的 code,然后在自己的会话中完成交换,获取受害者令牌。测试时:用同一 code 连续两次请求/token,观察第二次是否仍成功。

3.5 Referer 泄漏 code

部分应用把授权回调渲染成普通页面,页面加载时从第三方 CDN 拉取资源。此时包含?code=...的完整回调 URL 会通过Referer头发送给这些 CDN。能控制或攻陷 CDN 链接的攻击者即可提取 code。

测试方法:访问回调 URL,观察发往所有第三方主机的Referer头内容,确认是否携带 code。注意:较新浏览器默认Referrer-Policy可能只发送 origin,但许多老应用未设置该策略,或 CDN 资源请求走的是<img>/<script>等仍会带完整路径的场景。

3.6 scope 注入 / 令牌请求中的批量赋值

POST /token grant_type=authorization_code code=... scope=read write admin ← inject elevated scope

部分服务端在令牌交换阶段接受scope参数,且不重新校验其是否超出/authorize阶段授权的原始 scope(即不做服务端 scope 归一化)。这会导致权限提升。测试时比较/authorize授予的 scope 与/token返回令牌中实际包含的 scope。

3.7 response_type 混淆

混合流response_type=code id_token可能产生与纯 code 流不同的行为:

  • 服务端在 URL fragment 中返回 id_token(客户端可见);
  • 随后再走 code 交换获取 access_token;
  • 某些实现对不同response_type变体的 id_token 校验较弱甚至跳过。

测试方向:逐一尝试response_type=code、id_token、token、code id_token、code token、id_token token、code id_token token,观察返回差异与校验差异。

3.8 client_id 混淆

部分服务端仅以client_id作为身份标识,不做其他校验。若两个客户端共享相似的redirect_uri放行模式,可以复用 A 客户端的 code 到 B 客户端:

client_id=trusted-internal-app redirect_uri=https://attacker.com/cb (also allowlisted for trusted app!)

测试方向:枚举多个client_id(尤其是内部/受信应用),用同一 code 尝试跨客户端交换。

3.9 OAuth → 账户接管链(ATO chain)

这是 OAuth 攻击的"终局打法",经典五步链:

  1. 受害者在目标站点通过 OAuth(Google/Microsoft 等)登录;
  2. 攻击者在目标站点找到开放重定向(open redirect)或 XSS;
  3. 攻击者构造 OAuth 初始化 URL,redirect_uri通过开放重定向指向攻击者可控主机;
  4. 受害者点击 → 服务端签发 code → 受害者浏览器把带 code 的 URL 重定向到攻击者主机;
  5. 攻击者用 code 兑换受害者的令牌 → 完整 ATO。

该链条的完整方法论在 ato-methodology/SKILL.md 中有更宏观的决策树:OAuth 路径(第 5 条)是绕过 MFA 的天然通道之一——OAuth 登录往往不经过目标站点的 MFA 流程。开放重定向的独立价值很低(Low/Informational),但一旦与 OAuth 链式组合就达到 Critical,这一分级逻辑记录在 open-redirect/SKILL.md 中,其典型链式构造为:

redirect_uri=https://target.com/redir?to=https://evil.com/cb

OAuth 服务端看到的是字面上的target.com主机名从而放行,受害者浏览器则跟随 302 跳转到evil.com,code 落入攻击者之手。

3.10 账户关联漏洞(Account-linking)

"Sign in with Google" 等社交登录在按邮箱匹配已有账户时会引入关联漏洞:攻击者注册一个与受害者邮箱相似/子地址(typosquat 或 sub-add)的第三方账户,发起 OAuth,服务端仅凭 email 相同就把新 OAuth 身份关联到受害者的既有邮箱密码账户上。HackerOne 公开披露 #341876(Asana)即为此类账户关联漏洞。测试方向:检查社交登录时是否存在"仅按 email 自动关联、无用户确认"的逻辑。

4. 工具选型

  • oauthtoolkit——Tom Hudson 的 OAuth 自动化工具;
  • Burp Pro OAuth 流程扫描器;
  • oauth2-testPython 库,用于参数模糊测试;
  • ZAP Scripting(OAuth 模块);
  • 手动 + Burp Repeater——大多数深层缺陷需要细致的语义分析,自动化工具难以覆盖。

技能明确提示:多数真实缺陷需要人工语义层面的细致测试,自动化工具负责广撒网,Repeater 负责深挖。

5. PoC 构造模式

按技能给出的四步模式执行:

  1. 捕获一次正常授权流程(记录所有参数基线);
  2. 对每个参数(redirect_uri、state、scope、response_type、client_id、code_challenge)用 Burp Intruder + 上文的绕过 payload 列表逐个模糊测试;
  3. 一旦出现偏差(302 跳转到攻击者主机、签发带提权 scope 的令牌等),立即留存证据(请求/响应对);
  4. 构造 ATO 链:将 OAuth 缺陷与 open-redirect 或 XSS 组合,构造"受害者点击链接 → 令牌送达攻击者"的完整利用链。

关于 PoC 的证据规范,可以参考 ato-methodology/SKILL.md 中的 PoC 框架要求:攻击者自建账户、演示对受害者账户的完全可控性(以受害者身份登录、改邮箱、代发内容)、录制视频或逐步截图、不对受害者真实数据做破坏性操作——只证明访问可达。ATO 一旦完整达成,严重度即为 Critical(9.8–10.0)。

6. 严重度校准

缺陷典型严重度
真实客户端上 redirect_uri 绕过 → code 到攻击者Critical 9.8(完整 ATO)
社交登录缺失 stateHigh 8.0(一键账户劫持)
接受 scope 注入High 8.0
公开客户端 PKCE 降级High 7.5
接受 code 复用High 8.0
仅开放重定向链扩展Medium 6.0
按邮箱账户关联High-Critical,视实际影响而定

7. 防御者修复清单(Defender remediation)

技能给出的防御侧要点:

  • 精确匹配redirect_uri:大小写敏感、完整 URL、禁止任何路径操作(即完全白名单精确匹配,而非子串/前缀/正则通配);
  • 强制非空、不可预测的state:绑定到用户会话,且每次授权请求独立生成;
  • code 一次性使用:首次交换后立即作废,TTL 短(≤ 60 秒);
  • 所有公开客户端强制 PKCE;
  • 服务端 scope 校验:拒绝令牌请求中任何超出/authorize原始 scope 的scope参数;
  • 禁止仅按邮箱关联 OAuth 身份:关联既有账户前必须要求用户显式确认。

防御者视角可与 open-redirect/SKILL.md 中给出的安全重定向参考实现(基于urllib.parse.urlparse的safe_redirect,只放行白名单 netloc 且禁止协议相对 URL)配合阅读——它正是 OAuth redirect_uri 校验应采用的"精确匹配"思路的最小示例。

8. 在 Decepticon 技能体系中的交叉引用

  • 上游语料目录:skills/_corpus/payloads/OAuth Misconfiguration/(仓库中对应语料由 tools/references/h1_corpus.py 等参考语料工具加载管理);
  • ATO 链方法论:ato-methodology/SKILL.md;
  • 开放重定向链扩展:open-redirect/SKILL.md;
  • 签名密钥 / JWT 攻击:jwt/SKILL.md;
  • Web 攻击技能路由总览:web/SKILL.md。

9. 已知实例参考(Known exemplars)

技能记录了以下公开历史案例,可用于严重度论证与报告参考:

  • Microsoft 2020:通过 redirect_uri 缺陷构造的 Teams OAuth ATO 链,奖金 $50k;
  • Slack 2017:多个 redirect_uri 绕过,单个奖励 $4k–8k;
  • GitHub 2019:OAuth scope 注入缺陷,奖励 $5k;
  • Frans Rosén 的 OAuth 缺陷研究报告(业界公认的优质参考资源之一);
  • HackerOne 公开披露 #341876——Asana 按邮箱账户关联漏洞。

引用以上案例时需以公开披露原文为准核对细节;本文仅转述技能文档中记录的概要。

实践提醒:所有测试必须在获得授权的前提下进行。技能本身位于 Decepticon 的scope: authorized-target授权目标语义之下(见 web/SKILL.md 的 capability_contract),任何 OAuth 攻击测试都应限定在授权范围内,遵循目标厂商的漏洞披露政策。

【免费下载链接】Decepticon

Autonomous Hacking Agent for Red Team

项目地址:https://gitcode.com/gh_mirrors/de/Decepticon
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询