InQL扫描器:自动化GraphQL安全测试利器

InQL是一款由Doyensec开发的GraphQL安全测试工具,可作为独立脚本或Burp Suite扩展使用。它利用内省查询提取API结构,生成文档和查询模板,显著提升GraphQL端点漏洞检测效率,支持命令行和图形化操作。

InQL现已公开!

作为我们持续安全研究的一部分,我们开始开发内部工具以加速GraphQL安全测试工作。我们很高兴地宣布,InQL已在Github上可用。

InQL可用作独立脚本,或作为Burp Suite扩展(支持专业版和社区版)。该工具利用GraphQL内置的内省查询来转储查询、变更、订阅、字段、参数,并检索默认和自定义对象。

这些信息被收集并处理,以HTML和JSON模式的形式构建API端点文档。InQL还能够为所有已知类型生成查询模板。扫描器能够识别基本查询类型,并用占位符替换它们,使查询准备好被远程API端点接收。

我们相信,这一功能与将查询模板发送到Burp的Repeater工具的能力相结合,将减少利用GraphQL端点漏洞的时间,并大幅降低针对GraphQL技术栈的安全研究门槛。

InQL扫描器Burp Suite扩展

使用inql扩展for Burp Suite,您可以:

  • 搜索已知的GraphQL URL路径;工具将grep并匹配已知值以检测目标网站内的GraphQL端点
  • 搜索暴露的GraphQL开发控制台(GraphiQL、GraphQL Playground和其他常见实用程序)
  • 在每个包含GraphQL的HTTP请求/响应上使用自定义GraphQL标签
  • 通过将这些请求发送到Burp的Repeater工具来利用模板生成
  • 使用自定义设置标签配置工具

在Burp中启用InQL扫描器扩展

要在Burp Suite中使用inql,导入Python扩展:

  1. 下载最新的Jython Jar
  2. 下载最新版本的InQL扫描器
  3. 启动Burp Suite
  4. 扩展器标签 > 选项 > Python环境 > 设置Jython独立JAR的位置
  5. 扩展器标签 > 扩展 > 添加 > 扩展类型 > 选择Python
  6. 扩展文件 > 设置inql_burp.py的位置 > 下一步
  7. 输出窗口应显示以下消息:InQL扫描器已启动!

在不久的将来,我们可能会考虑将扩展集成到Burp的BApp商店中。

InQL演示

鉴于InQL的公开发布,我们完全改进了命令行界面。此界面保留了大部分Burp插件功能。

现在可以通过pip安装该工具,并通过您喜欢的CLI运行它。

1
pip install inql

对于所有支持的选项,请查看命令行帮助:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
usage: inql [-h] [-t TARGET] [-f SCHEMA_JSON_FILE] [-k KEY] [-p PROXY]
            [--header HEADERS HEADERS] [-d] [--generate-html]
            [--generate-schema] [--generate-queries] [--insecure]
            [-o OUTPUT_DIRECTORY]

InQL扫描器

可选参数:
  -h, --help            显示此帮助消息并退出
  -t TARGET             远程GraphQL端点 (https://<Target_IP>/graphql)
  -f SCHEMA_JSON_FILE   JSON格式的模式文件
  -k KEY                API认证密钥
  -p PROXY              通过的Web代理IP (http://127.0.0.1:8080)
  --header HEADERS HEADERS
  -d                    用占位符值替换已知的GraphQL参数类型(对Burp Suite有用)
  --generate-html       生成HTML文档
  --generate-schema     生成JSON模式文档
  --generate-queries    生成查询
  --insecure            接受任何SSL/TLS证书
  -o OUTPUT_DIRECTORY   输出目录

可以在众多暴露的API之一上执行示例查询,例如anilist.co端点:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ inql -t https://anilist.co/graphql
[+] 写入查询模板
 |  Page
 |  Media
 |  MediaTrend
 |  AiringSchedule
 |  Character
 |  Staff
 |  MediaList
 |  MediaListCollection
 |  GenreCollection
 |  MediaTagCollection
 |  User
 |  Viewer
 |  Notification
 |  Studio
 |  Review
 |  Activity
 |  ActivityReply
 |  Following
 |  Follower
 |  Thread
 |  ThreadComment
 |  Recommendation
 |  Like
 |  Markdown
 |  AniChartUser
 |  SiteStatistics
[+] 写入查询模板
 |  UpdateUser
 |  SaveMediaListEntry
 |  UpdateMediaListEntries
 |  DeleteMediaListEntry
 |  DeleteCustomList
 |  SaveTextActivity
 |  SaveMessageActivity
 |  SaveListActivity
 |  DeleteActivity
 |  ToggleActivitySubscription
 |  SaveActivityReply
 |  DeleteActivityReply
 |  ToggleLike
 |  ToggleLikeV2
 |  ToggleFollow
 |  ToggleFavourite
 |  UpdateFavouriteOrder
 |  SaveReview
 |  DeleteReview
 |  RateReview
 |  SaveRecommendation
 |  SaveThread
 |  DeleteThread
 |  ToggleThreadSubscription
 |  SaveThreadComment
 |  DeleteThreadComment
 |  UpdateAniChartSettings
 |  UpdateAniChartHighlights
[+] 写入查询模板
[+] 写入查询模板

生成的HTML文档页面将包含所有可用查询、变更和订阅的详细信息。

敬请关注!

早在2018年5月,我们发布了一篇关于GraphQL安全的博客文章,重点关注漏洞和错误配置。作为该研究努力的一部分,我们开发了一个简单的脚本来查询GraphQL端点。发布后,我们收到了许多积极的反馈,激发了进一步开发这一概念的更多兴趣。从那时起,我们改进了GraphQL测试方法和工具。作为我们标准客户参与的一部分,我们经常对GraphQL技术进行测试,因此我们期望继续在这一领域进行研究努力。展望未来,我们将继续改进检测并使工具更加稳定。

这个项目是在Doyensec研究岛上用爱制作的。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计