【免费下载链接】Decepticon
Autonomous Hacking Agent for Red Team
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 append | https://target.com/callback/../../evil |
| Subdomain wildcard | https://target.com.evil.com/cb(服务端匹配*.target.com) |
| Userinfo trick | https://target.com@evil.com/cb |
| Path-traversal in fragment | https://target.com/cb#@evil.com |
| Open-redirect chain | redirect_uri=https://target.com/known-redirect?to=evil.com |
| Localhost / loopback | redirect_uri=http://localhost:1337(常被放行) |
data:URI | redirect_uri=data:text/html,<script>...(少见但破坏力极大) |
| Mixed-protocol | 应要求https://处接受http:// |
| URL-encoded slash | https://target.com%2Fcallback%2F@evil.com |
| Different fragment behavior | redirect_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 攻击的"终局打法",经典五步链:
- 受害者在目标站点通过 OAuth(Google/Microsoft 等)登录;
- 攻击者在目标站点找到开放重定向(open redirect)或 XSS;
- 攻击者构造 OAuth 初始化 URL,
redirect_uri通过开放重定向指向攻击者可控主机; - 受害者点击 → 服务端签发 code → 受害者浏览器把带 code 的 URL 重定向到攻击者主机;
- 攻击者用 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/cbOAuth 服务端看到的是字面上的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 构造模式
按技能给出的四步模式执行:
- 捕获一次正常授权流程(记录所有参数基线);
- 对每个参数(
redirect_uri、state、scope、response_type、client_id、code_challenge)用 Burp Intruder + 上文的绕过 payload 列表逐个模糊测试; - 一旦出现偏差(302 跳转到攻击者主机、签发带提权 scope 的令牌等),立即留存证据(请求/响应对);
- 构造 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) |
| 社交登录缺失 state | High 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
相关推荐
Decepticon 攻击链技能解析:XSS 到账户接管(chain-xss-to-takeover)的构建与验证实战
Decepticon 攻击链技能解析:XSS 到账户接管(chain xss to takeover)的构建与验证实战 导读 chain xss to take
OAuth 误配置攻击面剖析:从 redirect_uri 劫持到 CSRF 防护(PayloadsAllTheThings 实战指南)
OAuth 误配置攻击面剖析:从 redirect_uri 劫持到 CSRF 防护(PayloadsAllTheThings 实战指南) OAuth 2.0 作
网络安全应用安全渗透测试Decepticon 实战拆解:XBEN-063-24 Loan Calculator 的 SSTI 编码绕过自动化攻击链路
Decepticon 实战拆解:XBEN 063 24 Loan Calculator 的 SSTI 编码绕过自动化攻击链路 本篇以 Decepticon 开源
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考