玩转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过程中遇到这类技术可以有针对性的进行漏洞挖掘,本人也是第一次接触此类技术如有错误还请斧正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jwt(Json web token)——使用token的权限验证方法 用户+角色+权限表设计 SpringBoot项目应用

目录 引出使用token的权限验证方法流程 用户、角色、权限表设计权限表角色表角色-权限关联表用户表查询用户的权限(四表联查)数据库的视图 项目中的应用自定义注解拦截器controller层DTO返回给前端枚举类型的json化日期json问题 实体类-DAO 总结 引出 1.…

配置Picgo图床之COS、OSS、Github图床

简介 PicGo是一款开源的图片上传和管理工具,它提供了简单易用的界面和丰富的功能,方便用户上传、管理和分享图片。 以下是PicGo的一些主要特点和功能: 图片上传:PicGo支持将本地图片快速上传到云存储服务,如七牛云、…

实现UDP可靠性传输

文章目录 1、TCP协议介绍1.1、ARQ协议1.2、停等式1.3、回退n帧1.4、选择性重传 1、TCP协议介绍 TCP协议是基于IP协议,面向连接,可靠基于字节流的传输层协议 1、基于IP协议:TCP协议是基于IP协议之上传输的,TCP协议报文中的源端口IP…

第九次作业

1. SSL工作过程是什么? 当客户端向一个 https 网站发起请求时,服务器会将 SSL 证书发送给客户端进行校验,SSL 证书中包含一个公钥。校验成功后,客户端会生成一个随机串,并使用受访网站的 SSL 证书公钥进行加密&#xf…

【TensorFlow】P0 Windows GPU 安装 TensorFlow、CUDA Toolkit、cuDNN

Windows 安装 TensorFlow、CUDA Toolkit、cuDNN 整体流程概述TensorFlow 与 CUDA ToolkitTensorFlow 是一个基于数据流图的深度学习框架CUDA 充分利用 NIVIDIA GPU 的计算能力CUDA Toolkit cuDNN 安装详细流程整理流程一:安装 CUDA Toolkit步骤一:获取CU…

golang协程池(goroutine池)ants库实践

golang中goroutine由运行时管理,使用go关键字就可以方便快捷的创建一个goroutine,受限于服务器硬件内存大小,如果不对goroutine数量进行限制,会出现Out of Memory错误。但是goroutine泄漏引发的血案,想必各位gopher都经历过&#…

在校外连接校内实验室服务器

zerotier 内网穿透 一、zerotier的操作 去官网注册、登录、创建网络 zerotier官网 我使用微软账号登录的,这个随便 点 Create A Network NETWORK ID点ID进去 二、服务器(校内)上的操作 1. Ubuntu配置SSH 如果出现不在sudoers列表的问题查看这里 sudo apt …

Signal Desktop for Mac(专业加密通讯软件)中文版安装教程

想让您的聊天信息更安全和隐藏吗? Mac版本的Signal Desktop是MACOS上的专业加密通信工具,非常安全。使用信号协议,该协议结合了固定前密钥,双重RATCHES算法和3-DH握手信号,该信号可以确保第三方实体将不会传达您的消息…

Telink泰凌微TLSR8258蓝牙开发笔记(一)

一、开发环境搭建 1.1、软件开发环境: 1.1.1、开发的IDE: IDE下载链接 1.1.2、烧录工具 DBT下载地址 1.1.3、蓝牙SDK 蓝牙SDK下载地址 1.2、硬件开发环境 8258开发板烧录工具一套 二、运行例程,并使能打印调试信息功能 File-->Impo…

广州VR制作 | 利用VR元宇宙平台开展林地管理培训的优势

在林业领域,实地调查是获取准确数据和深入了解森林生态的重要手段。然而,传统的实地调查方法存在诸多问题,如时间成本高、人力物力投入大、安全风险高等。为了解决这些教学痛点,我们引入了虚拟现实(VR)技术,通过虚拟林…

【果树农药喷洒机器人】Part5:基于深度相机与分割掩膜的果树冠层体积探测方法

文章目录 一、引言二、树冠体积测量对比方法2.1冠层体积人工测量法2.2冠层体积拟合测量法 三、基于深度相机与分割掩膜探测树冠体积方法3.1像素值与深度值的转换3.2树冠体积视觉探测法3.3实验分析 总结 一、引言 果树靶标探测是实现农药精准喷施的关键环节,本章以果…

编码技巧——Sentinel的blockHandler与fallback

本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法; 在查看源码前…

记录问题: servlet获取项目包绝对路径

【2023-8-8 23:46:27 星期二】 如何获取在webapp下的路径?而不是target包下的webapp目录 比如这里应该获取到 F:\Tiam\Desktop\freemarker\freemarker-demo01\src\main\webapp 而readPath总是获取到 F:\Tiam\Desktop\freemarker\freemarker-demo01\target\freemarker-demo0…

体验自制免费开源闯关学SQL

文章目录 前言mac安装nodejs启动体验 前言 sql是常用必不可少的一种语言,我们都或有各种各样的学习经历,最近看鱼皮大佬开源了一款自制的闯关学SQL项目,该项目是纯前端语言,不需要太多依赖以及前置知识,直接下载就可以…

事务,不只ACID | 京东物流技术团队

1. 什么是事务? 应用在运行时可能会发生数据库、硬件的故障,应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题,为了提高应用的可靠性和数据的一致性,事务应运而生。 从概念上讲,事务…

使用langchain与你自己的数据对话(五):聊天机器人

之前我已经完成了使用langchain与你自己的数据对话的前四篇博客,还没有阅读这四篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割使用langchain与你自己的数据对话(二):向量存储与嵌入使用langc…

常用开源的弱口令检查审计工具

常用开源的弱口令检查审计工具 1、SNETCracker 1.1、超级弱口令检查工具 SNETCracker超级弱口令检查工具是一款开源的Windows平台的弱口令安全审计工具,支持批量多线程检查,可快速发现弱密码、弱口令账号,密码支持和用户名结合进行检查&am…

DLA 神经网络的极限训练方法:gradient checkpointing

gradient checkpointing 一般来说,训练的过程需要保存中间结果(不管是GPU还是CPU)。前向传播根据输入(bottom_data)计算输出(top_data),后向传播由top_diff计算bottom_diff(如果某个变量打开梯度进行训练的话&#xff…

python实现对图油画、卡通、梦幻、草图、水彩效果

本篇博客将介绍如何使用wxPython模块和OpenCV库来实现对图像进行灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果的合并程序。程序可以通过wxPython提供的GUI界面来选择图片路径和效果类型,程序会将处理后的图像保存到指定路径并打开。 步骤一&#xf…

Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类

目录 1.Clonable接口和深拷贝 2.抽象类和接口的区别 3.Object类 4.获取对象的信息 5.对象比较方法equals 6.内部类 1.Clonable接口和深拷贝 Java 中内置了一些很有用的接口, Clonable 就是其中之一,Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对…