我用一个API调用,冒充了ServiceNow的任意用户——绕过MFA,无需密码

admin 2026-03-03 04:27:12 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档系统阐述了红队API攻防体系,涵盖侦察、认证绕过、授权突破与业务逻辑滥用四大阶段,并以ServiceNow等2026年最新案例为核心,揭示了API已成为现代攻击面的核心。关键发现包括利用AI代理API硬编码密钥冒充任意用户、JWT与APIKey的认证缺陷、BOLA/IDOR授权漏洞及限流绕过方法,并提供了完整的工具链与实战步骤。 综合评分: 85 文章分类: 渗透测试,WEB安全,漏洞分析,红队,API安全


cover_image

我用一个API调用,冒充了ServiceNow的任意用户——绕过MFA,无需密码

原创

逍遥 逍遥

逍遥子讲安全

2026年2月27日 02:33 广东

防守方还在加固Web界面时,我已经通过一个未文档化的API端点,绕过了MFA、接管了管理员账号、拖走了百万条数据。

2026年伊始,ServiceNow的“BodySnatcher”漏洞震惊业界:攻击者仅凭目标邮箱地址,利用AI代理API的硬编码密钥和过于宽松的账户关联逻辑,成功冒充任意用户——包括管理员,完全绕过MFA和SSO。这不是科幻,这是正在发生的API战争。

API已经成为现代应用的“数字骨架”,但同时也成为攻击者最爱的“高速公路”。Gartner预测,到2026年,90%的Web应用攻击面将集中在暴露的API上,而非用户界面。更可怕的是,IBM报告显示,2024年超过70%的云安全事件涉及易受攻击或暴露的API。

本文将首次完整公开我的红队API攻防深度狩猎体系——从信息收集、认证绕过、授权突破到业务逻辑滥用,涵盖6大攻击面、9个2026年最新实战案例、全套武器库,全是干到拧不出水的干货。

第一章 重新认知API:红队的“新大陆”

1.1 API攻防的四个价值层级

| 层级 | 攻击深度 | 典型操作 | 奖金/影响 | | — | — | — | — | | L1:基础暴露 | 发现未文档化API、影子API | 目录扫描、JS逆向 | 1000-3000元 | | L2:认证绕过 | JWT伪造、凭证泄露、SSO缺陷 | 算法混淆、硬编码密钥利用 | 3000-8000元 | | L3:授权突破 | BOLA/IDOR、越权操作 | 水平/垂直越权、资源ID遍历 | 5000-15000元 | | L4:业务逻辑滥用 | 状态机绕过、并发竞争、AI代理劫持 | 流程乱序、批量操作、Agent冒充 | 15000元+ |

核心认知:API攻防的终极目标不是“找到一个漏洞”,而是利用API间的信任链,从边缘突破到核心

1.2 现代API的三重防御体系

| 防御层 | 典型机制 | 攻击思路 | | — | — | — | | 传输层 | TLS/mTLS、证书锁定 | 证书替换、降级攻击 | | 身份层 | JWT、OAuth2、API Key | 算法混淆、密钥泄露、重放 | | 授权层 | RBAC、ABAC、资源所有权校验 | BOLA/IDOR、权限提升 | | 限流层 | Rate Limiting、WAF | IP伪造、分布式绕过 |

第二章 第一阶段:API侦察——绘制“数字神经图谱”

2.1 自动化API发现:你不知道的比你想象的更多

超过40%的企业API是“影子API”——由开发团队绕过安全部门自行搭建。这些API往往缺乏防护,是红队的“VIP通道”。

发现方法

bash# 1. 目录爆破(针对常见API路径)ffuf -u https://target.com/FUZZ -w api_paths.txt -recursion -recursion-depth 2# 2. JS文件逆向提取端点grep -r -E "/(api|v1|v2|graphql)/[a-zA-Z0-9_/-]+" *.js# 3. 流量监听分析# 使用Burp的被动扫描功能,记录所有经过代理的API调用

常用API路径字典(节选):

/api/v1/v2/v3/graphql/swagger/swagger-ui.html/api-docs/openapi.json/.well-known/openid-configuration/actuator/actuator/health/actuator/env

2.2 OpenAPI/Swagger文档:攻击者的“使用说明书”

许多API将文档暴露在公网,直接告诉攻击者如何调用、需要什么参数、返回什么数据。

利用方法

bash# 下载Swagger文档curl https://target.com/swagger/v1/swagger.json > api_spec.json# 使用工具生成测试用例npx openapi-validator api_spec.jsonpython3 /tools/swagger-hunter.py api_spec.json

实战案例:某金融APP的Swagger UI暴露在/swagger,未经任何认证。文档中明确列出/api/admin/createUser接口,攻击者直接调用创建了管理员账户。奖金:5,000元

2.3 版本控制与历史API:被遗忘的“僵尸”

开发人员常在新版本中修复漏洞,却忘记下线旧版本API。这些“僵尸API”成为攻击者的“时光机”。

发现技巧

bash# 探测常见版本路径ffuf -u https://target.com/vFUZZ/api/user -w versions.txt# 版本字典v1, v2, v3, v4, v5, v6v1.0, v1.1, v2.0, v2.12023, 2024, 2025, 2026

实战案例:某社交平台当前API为/v5,防护严密。但/v2接口仍可访问,且存在IDOR漏洞,攻击者可遍历所有用户资料。奖金:4,000元

2.4 GraphQL内省查询:打开“黑盒子”

GraphQL的内省查询可返回完整的API Schema,相当于直接拿到数据库结构。

内省查询Payload

graphqlquery {  __schema {    types {      name      fields {        name        type {          name          kind        }      }    }  }}

限制绕过:若生产环境禁用内省,可尝试在请求头中添加X-Introspection: true或修改User-Agent为开发环境标识。

第三章 第二阶段:认证绕过——打开“第一道门”

3.1 JWT攻击的七种武器

JWT是API认证的“标配”,也是最容易出问题的环节。

1. 算法混淆攻击(CVE-2015-9235)

当服务器配置接受非对称算法(RS256),但未禁用对称算法(HS256)时,攻击者可将alg改为HS256,用服务器的公钥作为对称密钥签名。

json// 修改JWT头部{  "alg": "HS256",  "typ": "JWT"}// 使用公钥作为密钥签名

2. 空签名攻击

某些JWT库配置不当,接受alg: none的令牌。

3. kid参数注入

JWT头部的kid用于指定密钥ID。若后端从文件系统读取密钥,可尝试../../../dev/null../../../../etc/passwd实现路径遍历。

4. JWKS欺骗

若服务器允许从URL加载公钥,攻击者可搭建恶意JWKS服务器,返回自己签名的公钥。

5. 敏感信息泄露

JWT的payload仅Base64编码,未加密。搜索其中的密码、密钥、内网IP。

6. 过期时间篡改

修改exp(过期时间)为未来值,或直接删除。

7. 暴力破解弱密钥

若JWT使用HS256且密钥较弱(如secret),可用hashcat爆破。

实战案例:某SaaS平台的JWT使用RS256,但错误地启用了HS256。攻击者将算法改为HS256,用从Swagger文档中发现的公钥签名,成功伪造管理员令牌。奖金:8,000元

3.2 API Key滥用的“三重门”

API Key作为长生命周期的认证凭证,一旦泄露,后果严重。

2026年最新案例:better-auth库认证绕过(CVE-2025-61928)

better-auth库每周下载量30万+。其API Keys插件存在严重缺陷:当请求中没有有效会话,但JSON体中包含userId字段时,应用程序错误地认为“不需要认证”,直接用攻击者控制的userId创建API Key。

jsonPOST /api/auth/api-key/create{  "userId": "admin-123",  "permissions": ["*"]}

后果:攻击者只需一个有效用户ID,即可为该用户创建API Key,绕过MFA,完全接管账户。

挖掘方法

  • 寻找API Key的创建/更新接口
  • 测试移除认证头后,是否仍需其他字段(如userId)即可成功
  • 观察是否存在“信任客户端输入”的逻辑缺陷

3.3 SSO/OAuth2的“信任裂缝”

2026年最新案例:Fortinet FortiCloud SSO认证绕过(CVE-2026-24858)

该漏洞允许攻击者用自己注册的设备,认证到其他FortiCloud账户名下的设备——当FortiCloud SSO启用时,账户隔离完全失效。

挖掘思路

  • 测试OAuth2的授权码是否可以重复使用
  • 测试重定向URI是否可以绕过(如使用/?#@混淆)
  • 测试state参数的CSRF防护是否存在

3.4 硬编码凭证的“定时炸弹”

ServiceNow BodySnatcher漏洞(CVE-2025-12420)

攻击者利用AI代理API中硬编码的全局密钥,结合过于宽松的账户关联逻辑,仅凭目标邮箱地址即可冒充任意用户,完全绕过MFA和SSO。

挖掘方法

  • 反编译APP/小程序,搜索secretkeytoken关键词
  • 流量抓包,观察是否在请求头或body中包含固定值
  • 测试能否用发现的密钥调用其他API

第四章 第三阶段:授权突破——真正的“深水区”

4.1 BOLA/IDOR:API安全的“头号杀手”

OWASP API Top 10中,API1: Broken Object Level Authorization位列第一。BOLA的本质是:API验证了“你是谁”,却没验证“这是否属于你”。

BOLA的授权鸿沟

现代微服务架构中,API网关确认用户身份(JWT有效),WAF确认请求语法正确(无SQL注入),但没有任何组件检查资源ID是否属于该用户

text用户A(攻击者)登录 → 获取令牌 → 请求 /api/v1/accounts/1234/balanceWAF: ✅ 语法干净网关: ✅ 会话有效后端: 返回账户1234余额(属于用户B)

挖掘方法

python# 水平越权检测脚本import requestsdef test_bola(base_url, victim_id, attacker_cookie):    # 用攻击者身份请求受害者资源    headers = {"Cookie": attacker_cookie}    r = requests.get(f"{base_url}/api/user/{victim_id}/profile", headers=headers)    if r.status_code == 200 and "敏感信息" in r.text:        print(f"[+] BOLA漏洞存在!可访问用户{victim_id}的数据")

自动化检测工具

  • Autorize(Burp插件):自动替换Cookie测试越权
  • BOLABuster:专门针对API的BOLA扫描器

4.2 BFLA:功能级授权缺失

BFLA(Broken Function Level Authorization)允许低权限用户执行高权限操作。

测试方法

  1. 用管理员账号操作敏感功能(创建用户、修改配置)
  2. 将请求中的Cookie替换为普通用户Cookie
  3. 若成功,则存在BFLA

实战案例:某电商后台,普通用户的/api/order/list接口可正常访问。攻击者尝试访问/api/admin/order/list,发现返回所有用户订单——无任何权限校验。奖金:6,000元

4.3 参数篡改与强制浏览

MyTube的Rate Limiting绕过(CVE-2026-23848)

该漏洞允许攻击者通过伪造X-Forwarded-For头,绕过IP限流,对API端点发起无限请求。

httpGET /api/videos/popular HTTP/1.1Host: mytube.comX-Forwarded-For: 1.2.3.4  # 可任意伪造

挖掘方法

  • 寻找所有使用客户端IP进行限流/审计的功能
  • 测试X-Forwarded-ForX-Real-IPX-Original-Forwarded-For等头
  • 观察是否可绕过限制

4.4 批量分配(Mass Assignment)

当API自动将请求参数映射到对象属性时,攻击者可能修改不该修改的字段。

经典案例

jsonPOST /api/user/update{  "name": "新名字",  "isAdmin": true  // 本不应被用户修改}

挖掘方法

  • 收集所有对象属性(通过Swagger、JS、错误信息)
  • 尝试在请求中添加额外字段
  • 观察是否被成功赋值

第五章 第四阶段:业务逻辑滥用——API攻击的“艺术”

5.1 状态机绕过:乱序操作

许多业务API要求按特定顺序调用(如:下单→支付→确认)。攻击者可能跳过步骤或乱序调用。

实战案例:某票务平台,支付完成后调用/api/confirm确认出票。攻击者发现/api/confirm可直接调用,无需支付——直接获得有效票。奖金:7,000元

5.2 并发竞争条件

利用高并发请求,让业务逻辑“来不及反应”。

实战案例:某优惠券系统,每个用户限领一张。攻击者用100个线程同时发送领券请求,成功领取多张。奖金:5,000元

5.3 AI代理劫持:2026年最新威胁

ServiceNow BodySnatcher漏洞的本质是:当AI代理被赋予过高权限,且身份验证不严格时,攻击者可通过API冒充用户,让AI代理执行恶意操作。

挖掘方向

  • 寻找由AI代理调用的API(通常路径含/agent/ai/virtual-agent
  • 测试这些API的认证是否与普通API一致
  • 尝试用低权限用户调用高权限AI操作

第六章 实战案例库(完整攻击链)

【案例1】ServiceNow BodySnatcher:AI代理API的致命缺陷

目标:ServiceNow Virtual Agent API 时间:2025年底披露 影响:可冒充任意用户,绕过MFA/SSO

攻击路径

  1. 信息收集:发现ServiceNow的AI代理API集成点
  2. 逆向分析:发现平台级硬编码密钥
  3. 逻辑分析:账户关联逻辑过于宽松,仅用邮箱地址关联
  4. 攻击构造:用硬编码密钥+目标邮箱,发起冒充请求
  5. 后果:完全接管目标账户,包括管理员权限

修复:ServiceNow发布补丁,但警示AI代理将成新攻击面。

【案例2】SmarterMail密码重置API的认证缺失

目标:SmarterMail邮件平台(CVE-2026-23760) 时间:2026年1月 影响:管理员账户完全接管,RCE

攻击路径

  1. API发现:定位到/api/v1/auth/force-reset-password端点
  2. 逻辑分析:该端点本应校验原密码,但对管理员账户完全跳过校验
  3. 攻击:仅需知道管理员用户名,即可重置密码
  4. 升级:登录后利用后台功能执行系统命令
  5. 武器化:补丁发布后48小时内,攻击者通过逆向生成1-day exploit

教训:认证逻辑的“例外情况”往往是最大风险点。

【案例3】better-auth API Key创建绕过

目标:使用better-auth库的应用(CVE-2025-61928) 时间:2026年2月 影响:未授权创建API Key,账户接管

攻击路径

  1. 接口分析/api/auth/api-key/create端点
  2. 逻辑缺陷:无有效会话时,若JSON中包含userId,则直接创建Key
  3. 攻击:枚举有效userId(通过公开资料、IDOR、遍历)
  4. 后果:获得目标用户的API Key,绕过MFA长期驻留

【案例4】MyTube Rate Limiting绕过

目标:MyTube视频平台(CVE-2026-23848) 时间:2026年1月 影响:未认证DoS攻击,无限请求

攻击路径

  1. 限流机制分析:基于IP的限流
  2. 缺陷发现:服务器信任X-Forwarded-For
  3. 攻击:伪造随机IP发送请求,绕过限流
  4. 后果:可对任意API发起无限请求,导致服务不可用

【案例5】LLM网关的SQL注入(CVE-2026-25591)

目标:New API(LLM网关系统) 时间:2026年2月 影响:资源耗尽DoS

攻击路径

  1. 端点发现/api/token/search
  2. 参数分析keywordtoken参数直接拼接到SQL LIKE子句
  3. 注入攻击:传入%%等通配符,触发全表扫描
  4. 后果:数据库资源耗尽,服务瘫痪

第七章 自动化武器库

7.1 API端点发现工具链

bash# Kiterunner - 专为API设计的爆破工具kr scan https://target.com -w routes-large.kite# Arjun - 参数发现arjun -u https://target.com/api/endpoint# LinkFinder - JS中提取APIpython linkfinder.py -i https://target.com/app.js -o cli

7.2 JWT攻击工具箱

bash# jwt_tool - 全能JWT测试python3 jwt_tool.py -t https://target.com/api/ -rh&nbsp;"Authorization: Bearer <JWT>"&nbsp;-M at# jwt-cracker - 爆破弱密钥jwt-cracker <JWT> <字典># c-jwt-cracker - 快速爆破

7.3 BOLA自动化检测

python# bola_scanner.pyimport&nbsp;requestsimport&nbsp;threadingclass&nbsp;BOLAScanner:&nbsp; &nbsp;&nbsp;def&nbsp;__init__(self, base_url, endpoints, user1_cookie, user2_id):&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;self.base_url = base_url&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;self.endpoints = endpoints&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;self.cookie = user1_cookie&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;self.victim_id = user2_id
&nbsp; &nbsp;&nbsp;def&nbsp;scan_endpoint(self, endpoint):&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 将端点中的{id}替换为受害者ID&nbsp; &nbsp; &nbsp; &nbsp; test_url = endpoint.replace("{id}",&nbsp;str(self.victim_id))&nbsp; &nbsp; &nbsp; &nbsp; headers = {"Cookie":&nbsp;self.cookie}&nbsp; &nbsp; &nbsp; &nbsp; r = requests.get(f"{self.base_url}{test_url}", headers=headers)
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;r.status_code ==&nbsp;200:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 检查是否包含敏感信息&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;"email"&nbsp;in&nbsp;r.text&nbsp;or&nbsp;"phone"&nbsp;in&nbsp;r.text:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(f"[+] BOLA可能:&nbsp;{test_url}")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(f" &nbsp; &nbsp;响应:&nbsp;{r.text[:200]}")
&nbsp; &nbsp;&nbsp;def&nbsp;scan_all(self):&nbsp; &nbsp; &nbsp; &nbsp; threads = []&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for&nbsp;ep&nbsp;in&nbsp;self.endpoints:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = threading.Thread(target=self.scan_endpoint, args=(ep,))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threads.append(t)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t.start()&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for&nbsp;t&nbsp;in&nbsp;threads:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t.join()

7.4 限流绕过工具

python# rate_limit_bypass.pyimport&nbsp;requestsimport&nbsp;randomdef&nbsp;generate_random_ip():&nbsp; &nbsp;&nbsp;return&nbsp;f"{random.randint(1,255)}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(1,255)}"def&nbsp;bypass_rate_limit(url, headers, count=100):&nbsp; &nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(count):&nbsp; &nbsp; &nbsp; &nbsp; fake_ip = generate_random_ip()&nbsp; &nbsp; &nbsp; &nbsp; headers["X-Forwarded-For"] = fake_ip&nbsp; &nbsp; &nbsp; &nbsp; r = requests.get(url, headers=headers)&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;r.status_code ==&nbsp;200:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(f"[+] 请求成功,伪造IP:&nbsp;{fake_ip}")&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print(f"[-] 请求失败:&nbsp;{r.status_code}")

第八章 防御视角:红队API攻击的七大死穴

8.1 为什么API防御总是失效

| 原因 | 说明 | 红队利用点 | | — | — | — | | 影子API | 开发团队自行搭建,未纳入安全流程 | 目录扫描、JS提取 | | 历史版本 | 旧API未下线,带着旧漏洞 | 版本探测 | | 过度信任 | 服务间调用无认证,仅靠网络隔离 | SSRF、服务跳板 | | 逻辑缺陷 | 业务规则在客户端实现 | 状态机绕过、并发竞争 | | 异常例外 | 管理员、调试模式绕过正常逻辑 | 权限提升 | | 文档泄露 | Swagger暴露完整接口 | 直接调用 | | 客户端硬编码 | 密钥、令牌在APP/小程序中 | 反编译提取 |

8.2 企业自查清单

  • 是否有完整的API资产清单?(含所有历史版本)
  • Swagger/OpenAPI文档是否禁止公网访问?
  • JWT是否禁用alg: none和算法混淆?
  • 所有API是否都有资源所有权校验?(BOLA防御)
  • 是否依赖X-Forwarded-For等客户端可控头做安全决策?
  • API密钥是否有短生命周期和最小权限原则?
  • 是否监控异常API调用模式?(如单用户访问大量ID)
  • 是否有API网关统一认证授权,而非各服务自治?

第九章 结语:API战争的终局

API已经成为现代应用的“数字神经”,但也成为攻击者最爱的“高速公路”。

从2026年开年的几个重大漏洞可以看出:认证逻辑的“例外情况”、AI代理的过度权限、客户端硬编码的密钥,正在成为红队的新宠。

ServiceNow的BodySnatcher告诉我们:当AI代理开始调用API,传统认证模型面临根本性挑战。better-auth的API Key创建漏洞提醒我们:哪怕每周下载30万次的库,也可能犯最基础的逻辑错误。SmarterMail的48小时武器化警告我们:AI辅助的补丁分析,正在将漏洞窗口压缩到极致。

下次面对API目标时,别只盯着SQL注入和XSS。

先问自己四个问题:

  1. 这个API有文档吗?文档暴露了吗?
  2. JWT能伪造吗?API Key能绕过认证创建吗?
  3. 我能访问别人的资源吗?(BOLA)
  4. 这个API背后的业务逻辑能被滥用吗?

答案,往往决定你是拿500还是拿15000。

而你的奖金,也在这四个问题的延长线上。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:逍遥子讲安全 逍遥 逍遥《我用一个API调用,冒充了ServiceNow的任意用户——绕过MFA,无需密码》

社会工程学巅峰 网络安全文章

社会工程学巅峰

文章总结: 该文档标题为社会工程学巅峰,实为知树安全团队的公众号推广与资源引流文章。文中列举了免杀课程、爆破字典、逆向教程及CNVD挖掘技巧等资料的获取代码,要
评论:0   参与:  0