玩转graphQL

转载至酒仙桥的玩转graphQL - SecPulse.COM | 安全脉搏

前言

在测试中我发现了很多网站开始使用GraphQL技术,并且在测试中发现了其使用过程中存在的问题,那么,到底GraphQL是什么呢?了解了GraphQL后能帮助我们在渗透测试中发现哪些问题呢?

在测试中,我们最常见的graphql的数据包就像图中一样:

和json类似的格式,但其中包含了很多换行符n,当你遇到这种结构的请求时,请多留心测试一下GraphQL是否安全。

前置知识

什么是GraphQL

GraphQL 是一个用于API的查询语言,使用基于类型系统来执行查询的服务(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

如果你了解REST API会更快地了解它。像REST API,往往我们的请求需要多个API,每个API是一个类型。比如:http://www.test.com/users/{id} 这个API可以获取用户的信息;再比如:http://www.test.com/users/list 这个API可以获取所有用户的信息。

在graphql中则不需要这么多api来实现不同的功能,你只需要一个API,比如:http://www.test.com/graphql即可。查询不同的内容仅需要改变post内容,不再需要维护多个api。(使用官方的demo进行演示:https://graphql.org/swapi-graphql)

比如查id为1的一个人的生日,可以这么查:

想查他的身高、发色可以这么查:

我想查id为2的人的信息我可以这么查:

通过上面这个例子就可以看出graphql与REST API的区别,仅用一个API即可完成所有的查询操作。并且他的语法和结构都是以一个对象不同属性的粒度划分,简单好用。

基本属性

GraphQL的执行逻辑大致如下:

查询->解析->验证->执行

根据官方文档,主要的操作类型有三种:query(查询)、mutation(变更)、subscription(订阅),最常用的就是query,所有的查询都需要操作类型,除了简写查询语法。

类型语言TypeLanguage,type来定义对象的类型和字段,理解成一个数据结构,可以无关实现graphQL的语言类型。类型语言包括Scalar(标量)和Object(对象)两种。并且支持接口抽象类型。

Schema用于描述数据逻辑,Schema就是对象的合计,其中定义的大部分为普通对象类型。一定包括query,可能包含mutation,作为一个GraphQL的查询入口。

Resolver用于实现解析逻辑,当一个字段被执行时,相应的 resolver 被调用以产生下一个值。

内省查询

简单来说就是,GraphQL内置了接口文档,你可以通过内省的方法获得这些信息,如对象定义、接口参数等信息。

当使用者不知道某个GraphQL接口中的类型哪些是可用的,可以通过__schema字段来向GraphQL查询哪些类型是可用的。

具体可以参考GraphQL文档学习。

GraphQL中常见的问题

内省查询问题

这本来应该是仅允许内部访问,但配置错误导致任何攻击者可以获得这些信息。

还是拿官网的demo来测试。

一个正常的查询请求如下。

通过内省查询获得的数据如下:

{"query":"n    query IntrospectionQuery {rn      __schema {rn        queryType { name }rn        mutationType { name }rn        subscriptionType { name }rn        types {rn          ...FullTypern        }rn        directives {rn          namern          descriptionrn          locationsrn          args {rn            ...InputValuern          }rn        }rn      }rn    }rnrn    fragment FullType on __Type {rn      kindrn      namern      descriptionrn      fields(includeDeprecated: true) {rn        namern        descriptionrn        args {rn          ...InputValuern        }rn        type {rn          ...TypeRefrn        }rn        isDeprecatedrn        deprecationReasonrn      }rn      inputFields {rn        ...InputValuern      }rn      interfaces {rn        ...TypeRefrn      }rn      enumValues(includeDeprecated: true) {rn        namern        descriptionrn        isDeprecatedrn        deprecationReasonrn      }rn      possibleTypes {rn        ...TypeRefrn      }rn    }rnrn    fragment InputValue on __InputValue {rn      namern      descriptionrn      type { ...TypeRef }rn      defaultValuern    }rnrn    fragment TypeRef on __Type {rn      kindrn      namern      ofType {rn        kindrn        namern        ofType {rn          kindrn          namern          ofType {rn            kindrn            namern            ofType {rn              kindrn              namern              ofType {rn                kindrn                namern                ofType {rn                  kindrn                  namern                  ofType {rn                    kindrn                    namern                  }rn                }rn              }rn            }rn          }rn        }rn      }rn    }rn  ","variables":null}

返回包返回的就是该API端点的所有信息。复制返回包到以下网址可以得到所有的对象定义、接口信息。

https://apis.guru/graphql-voyager/

github也有很多工具可以直接绘制接口文档:

https://github.com/2fd/graphdoc

https://github.com/graphql/graphql-playground

这是garphql最常见的一类问题,通过这些文档我们就能很轻松的找到存在问题的对象了。通过遍历,即可发现很多安全问题。不过这个问题可以通过配置来解决,让攻击者无法获得敏感信息,或者其他攻击面。

信息泄露

通过内省查询,我们可以得到很多后端接口的信息。有了这些信息通过排查便可能发现更多的安全问题,比如信息泄露。

查询存在的类型:

查询类型所有的字段:

在查找字段里是否包含一些敏感字段:

Email、token、password、authcode、license、key、session、secretKey、uid、address等。

除此以外还可以搜索类型中是否有edit、delete、remove、add等功能,来达到数据编辑、删除、添加的功能。

SQL注入

graphql的sql注入与一般的sql注入类似,都是可以通过构造恶意语句达到注入获取数据或改变查询逻辑的目的。p神在先知大会上讲过该类问题,借用p神的2张PPT。

只有直接使用graphql进行查询才会出现的问题,正确的使用参数化查询,不会遇到sql注入的问题。

CSRF

在Express-GraphQL中存在CSRF漏洞。如果将Content-Type修改为application/x-www-form-urlencoded ,再将POST请求包内容URL编码并生成csrf poc 即可实施csrf攻击,对敏感操作如mutation(变更)造成危害。

修复方式可以考虑将CORS配置为仅允许来自受信任域的白名单的请求,或者确保正在使用CSRF令牌.实施多种保护将降低成功攻击的风险.

嵌套查询拒绝服务

当业务的变量互相关联,如以下graphql定义为这样时,就可能无限展开,造成拒绝服务。

type Thread {  messages(first: Int, after: String): [Message]}
type Message {  thread: Thread}
type Query {  thread(id: ID!): Thread}

就有可能存在拒绝服务的风险。

就可能造成服务器拒绝服务。

修复方式可以考虑增加深度限制,使用graphql-depth-limit模块查询数量限制;或者使用graphql-input-number创建一个标量,设置最大为100

权限问题

graphql本身建议由业务层做权限控制,graphql作为一个单路由的API接口完成数据查询操作。开发者在使用时经常会忽略接口的鉴权问题。有时候客户端调用查询接口,直接传入了id等信息并未做好权限校验,就有可能存在水平越权。

修复方式建议在GraphQL和数据之间多加一个权限校验层,或者由业务自行实现权限校验。

总结

GraphQL技术由于其兼容restAPI,降低了API维护的成本已有很多企业在使用。可能存在的安全问题有:

1) 信息泄露

2) Sql注入

3) Csrf漏洞

4) 嵌套查询拒绝服务漏洞

5) 越权漏洞

6) 内省查询

在理解了GraphQL的工作原理和存在的问题后,大家工作或挖SRC过程中遇到这类技术可以有针对性的进行漏洞挖掘,本人也是第一次接触此类技术如有错误还请斧正。

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

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

相关文章

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0~AIN10为模拟输入端; 15——CS 为片选端; 17——DIN 为串行数据输入端;(控制字输入端,用于选择转换及输出数据格式) 16——…

Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

文章目录 Unity进阶--使用PhotonServer实现服务端和客户端通信服务器的安装和配置添加日志客户端的配置客户端和服务器的通信Dlc 出现vscode引用不好使的时候 Unity进阶–使用PhotonServer实现服务端和客户端通信 服务器的安装和配置 Photon的地址:https://www.ph…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上,因此实现方案如下: (1) ceph集群开启mgr内置的exporter服务,用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

RESTful

RESTful 简介 REST(Representational State Transfer):表现层资源状态转移 ①资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上可命名的抽象概念。因为资源是一种抽象概念&#xff0…

vue3获得url上的参数值

1、引入 import { useRoute } from vue-router2、获得const route useRoute() console.log(route.query.number)

el-table实现指定列合并

table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素…

HTML 初

前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

conda install 和pip install有什么区别?

本篇为分享贴&#xff0c;截图部分选自知乎&#xff0c;部分选自csdn&#xff0c;文字内容是结合自己实践进行总结。 环境引用的包在哪&#xff1f; 首先&#xff0c;一条命令&#xff1a; python -m site 这条命令可以定位引用的包在哪里 &#xff0c;当然也可以自己设置默认…

Java课题笔记~ 关于错误与异常

非检查异常(unckecked exception)&#xff1a;Error 和 RuntimeException 以及他们的子类。javac在编译时&#xff0c;不会提示和发现这样的异常&#xff0c;不要求程序员必须处理这些异常。在运行阶段&#xff0c;倘若发生Error则虚拟机几乎崩溃&#xff0c;倘若发生RuntimeEx…

mysql的主从复制和读写分离

目录 一、mysql的主从复制和读写分离的相关知识 1&#xff09;什么是读写分离? 2&#xff09;为什么要读写分离呢? 3&#xff09;什么时候要读写分离? 4&#xff09;主从复制的优点 5&#xff09;主从复制与读写分离 6&#xff09;mysql支持的复制类型 STATEMENT和r…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑&#xff0c;一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意&#xff1a;针对一些老项目 还是尽量采用 3.6.3版本&#xff0c;针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

vue中vuex的五个属性和基本用法,另加js-cookie的使用

VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 1. state&#xff1a; vuex的基本数据&…

HDFS中snapshot快照机制

HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录&#xff0c;备份&#xff08;backup&#xff09;则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像&#xff0c;该镜像…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据分享】2023年我国省市县三级的上市公司数量(Excel/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;在众多公司企业中&#xff0c;上市公司堪称明珠&#xff0c;上市公司通常经济规模大、影响力强、员工多。哪个城市的上市公司更多&#xff0c;往往这个城市的经济实力越强&…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机&#xff0c;没有蓝牙驱动&#xff0c;在用logi无线鼠标时&#xff0c;把鼠标连接插入台式机后弹出的如上图所示这个提示&#xff0c;无论是点是/否&#xff0c;还是X掉上图提示&#xff0c;电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有&#xff0c;然…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…