GraphQL Cop 是一个用于对 GraphQL API 执行常见安全测试的轻量级 Python 工具。它非常适合在 GraphQL 中进行 CI/CD 检查,覆盖了 GraphQL 中值得关注的安全问题。
GraphQL Cop 允许你在发现漏洞时通过提供 cURL 命令来复现结果。
执行以下命令来安装依赖。
python3 -m venv path/to/venv
source path/to/venv/bin/activate
python3 -m pip install -r requirements.txt
第一条命令在 path/to/venv 指定的目录中创建一个虚拟环境。
第二条命令激活该虚拟环境。
最后一条命令安装 requirements.txt 中列出的所有 Python 包。
$ python3 graphql-cop.py -h
Usage: graphql-cop.py -t http://example.com -o json
Options:
-h, --help 显示此帮助信息并退出
-t URL, --target=URL 目标 URL(包括路径)——如果未提供 GraphQL 路径,GraphQL Cop 将遍历一系列常见 GraphQL 路径
-H HEADER, --header=HEADER
向请求附加标头 '{"Authorization": "Bearer eyjt"}' —— 使用多个 -H 添加更多标头
-o FORMAT, --output=FORMAT
输出格式:json
-e EXCLUDED_TESTS, --excluded-tests=EXCLUDED_TESTS
排除特定测试
-l, --list-tests 列出可用的测试
-f, --force 当无法检测到 GraphQL 时强制扫描
-d, --debug 附加一个包含测试名称的标头以进行调试
-x PROXY, --proxy=PROXY
HTTP(S) 代理 URL,格式为 http://user:pass@host:port
-w WORDLIST, --wordlist=WORDLIST
自定义 GraphQL 端点列表的路径
-v, --version 打印当前版本并退出
-T, --tor 通过 Tor 网络发送请求(确保 Tor 已运行且配置正确)
$ python3 graphql-cop.py -t https://mywebsite.com/graphql
[HIGH] 内省查询已启用(信息泄露)
[LOW] GraphQL Playground UI(信息泄露)
[HIGH] 允许 100 个以上别名的别名重载(拒绝服务)
[HIGH] 允许包含 1000 个以上相同重复字段的查询(拒绝服务)
$ python3 graphql-cop.py -t https://mywebsite.com/graphql -e field_duplication
[HIGH] 内省查询已启用(信息泄露)
[LOW] GraphQL Playground UI(信息泄露)
[HIGH] 允许 100 个以上别名的别名重载(拒绝服务)
[HIGH] 允许包含 1000 个以上相同重复字段的查询(拒绝服务)
python3 graphql-cop.py -t https://mywebsite.com/graphql -o json
{'curl_verify': 'curl -X POST -H "User-Agent: graphql-cop/1.2" -H '
'"Accept-Encoding: gzip, deflate" -H "Accept: */*" -H '
'"Connection: keep-alive" -H "Content-Length: 33" -H '
'"Content-Type: application/json" -d \'{"query": "query { '
'__typename }"}\' \'http://localhost:5013/graphql\'',
'description': '跟踪功能已启用',
'impact': '信息泄露',
'result': False,
'severity': 'INFO',
'color': 'green',
'title': '跟踪模式'},
{'curl_verify': 'curl -X POST -H "User-Agent: graphql-cop/1.2" -H '
'"Accept-Encoding: gzip, deflate" -H "Accept: */*" -H '
'"Connection: keep-alive" -H "Content-Length: 64" -H '
'"Content-Type: application/json" -d \'{"query": "query { '
'__typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }"}\' '
"'http://localhost:5013/graphql'",
'description': '查询中允许出现多个重复指令',
'impact': '拒绝服务',
'result': True,
'severity': 'HIGH',
'color': 'red',
'title': '指令重载'}]
$ python3 graphql-cop.py -t https://mywebsite.com/graphql --proxy=http://127.0.0.1:8080 --header '{"Authorization": "Bearer token_here"}'
[HIGH] 内省查询已启用(信息泄露)
[LOW] GraphQL Playground UI(信息泄露)
[HIGH] 允许 100 个以上别名的别名重载(拒绝服务)
[HIGH] 允许包含 1000 个以上相同重复字段的查询(拒绝服务)
git clone https://github.com/dolevf/graphql-cop.git
cd graphql-cop
docker build -t graphql-cop:latest .
你可以按如下方式运行 Docker 容器并向 graphql-cop 脚本传递参数:
docker run --rm -it graphql-cop:latest -t <GRAPHQL_ENDPOINT> -H '{"<HEADER_KEY>": "<HEADER_VALUE>"}'
以下是运行容器的一个示例:
docker run --rm -it graphql-cop:latest -t https://example.com/graphql -H '{"Authorization": "Bearer abc123xyz"}'
要查看所有可用选项,请运行:
docker run --rm -it graphql-cop:latest --help