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

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,暴力破解等等

应急响应笔记

学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JZM-A系列机械隔膜计量泵

引言: 在现代工业生产过程中,对流体材料的精准计量和输送需求日益提高。面对这一挑战,JZM-A系列机械隔膜计量泵以其卓越的设计、准确的计量能力和高效的性能,为各行各业提供了一种可靠的解决方案。本文将详细解析JZM-A系列计量泵的…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代,社交媒体已经成为人们日常生活的重要组成部分,而Facebook作为最知名的社交媒体平台之一,其成功之处备受瞩目。本文将深入解析Facebook的成功密码,探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

6.1Python之字典的初识

【1】字典的创建与价值 字典(Dictionary)是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中,键(Key)必须是唯一的,而值(Value)则可以是任意类型的数据。…

ue4打包多模块

首先,每个模块,包含插件内的模块在内,都要用IMPLEMENT_MODULE(类名, 模块名)的方式,模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用,用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

花花省V6淘宝客APP社交电商自营商城聚合优惠券系统

首页广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加油、阿里巴巴、去哪网、电影票、飞猪旅行、美团酒店、当当网、肯德基、热门抖货、商品推荐、商品详情、…

基于Springboot + vue +MySQL 留守儿童爱心网站 (含源码)

目录 📚 前言 📑摘要 📑系统架构 📚 数据库设计 💬 志愿活动属性图 💬 爱心捐赠实体属性 📚 系统功能的具体实现 💬 系统功能模块 宣传新闻 志愿活动 💬 管理员功…

基于java+springboot+vue实现的售楼管理系统(文末源码+Lw)23-255

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

312_C++_QT表格的剪切、拷贝、粘贴,轻量化操作

:拷贝 + 粘贴 :剪切 + 粘贴 void CustomTableWidget::cut() {copy();// 获取所有选定的单元格项QList<QTableWidgetItem*> selectedItemsList

SpringBoot学习之Kibana下载安装和启动(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…

FASTAPI系列 20-异常处理器exception_handler

FASTAPI系列 20-异常处理器exception_handler 文章目录 FASTAPI系列 20-异常处理器exception_handler前言一、HTTPException 异常&#xff1f;二、覆盖默认的HTTPException 异常三、覆盖请求验证异常RequestValidationError 源码分析 总结更多内容&#xff0c;请关注公众号 前言…

GET与POST:详述HTTP两大请求方法的语义、数据处理机制、安全特性与适用场景

GET和POST方法在HTTP请求中具有明确的角色分工和特性差异。GET适用于读取操作和不敏感数据的传递&#xff0c;强调可缓存性和安全性&#xff0c;而POST适用于写入操作和敏感数据的提交&#xff0c;提供了更大的数据承载能力和更强的隐私保护。本文详细介绍了GET与POST请求方法的…

多张固定宽度元素,随着屏幕尺寸变化自动换行

背景&#xff1a;多张固定宽度元素&#xff0c;随着屏幕尺寸变化自动换行实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevic…

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富&#xff0c;包括主流标准协议&#xff0c;有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海…

Java 集合Collection

集合的体系 Collection的结构体系 List系列集合&#xff1a;添加的元素是有序的、可重复、有索引。Set系列集合&#xff1a;无序、不重复、无索引 HashSet&#xff1a;无序、不重复、无索引LinkedHashSet:有序、不重复、无索引TreeSet&#xff1a;按照大小默认升序排序、不重复…

VueRouter使用,界面切换

一、安装 vue-router3&#xff0c;4分别对应vue2&#xff0c;3.。我现在用的是vue2&#xff0c; npm install vue-router3二、使用 ①首先在component路径下提前写好需要渲染的组件。 ②在App.vue中使用router声明路由。其中router-link的to指明渲染哪一个组件。router-view…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下&#xff0c; 你只需委托给 SpringApplication.run这个静态方法 &#xff1a; SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议&#xff0c;它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响&#xff0c;并探讨它们在现代Web…

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…