GraphQL渗透测试详解

这篇具有很好参考价值的文章主要介绍了GraphQL渗透测试详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GraphQL介绍

GraphQL概述

GraphQL 是一种查询语言,用于 API 设计和数据交互。它是由 Facebook 发布的一款新型的数据查询和操作语言,自 2012 年起在内部使用,自 2015 年起获得开源许可。由于技术原因,越来越多的公司使用 GraphQL 并将其后端切换到这个新系统,但是,虽然这种查询语言有很多优点,但随着查询变得更加复杂,它也有一些安全问题。信息泄露、业务逻辑错误、IDOR 和不当访问控制是 GraphQL 端点上最常见的漏洞。

GraphQL与传统RESTful API的区别

GraphQL 允许客户端在一个请求中明确地指定需要的数据,并返回预期的结果,而不是像 RESTful API 那样只能获取预定义的资源。因此,GraphQL 简化了客户端与服务器之间的通信,提高了应用程序的性能和可扩展性。

与传统的 RESTful API 不同,GraphQL 通过将数据查询和数据修改分离开来,使得客户端能够更灵活地控制所需数据的粒度和类型,并且在多个资源之间建立关系。这样,客户端就可以很容易地实现高效的数据获取和更新,而无需为每个特定的用例编写特定的 API。

GraphQL应用

目前正在使用GraphQL的大型公司包括Facebook、PayPal、GitHub、Shopify、Twitter、Tesla、Hackerone等大型公司,可见GraphQL正在迅猛发展。

GraphQL渗透测试前置知识

GraphQL查询语言

我们根据前文已经得知,GraphQL是一种用于API的查询语言,它支持很多种查询方式:

  • Query
  • Mutation
  • Subscription
  • Input
  • Enum
  • Union
  • Interface

我们接下来主要介绍一下Query、Mutation、Subscription这三种。

Query

Query是GraphQL中最常用的一种方式。它用于从服务端获取数据,类似于RESTful API的GET方法。使用Query可以指定需要返回的字段以及过滤条件。

例如,以下查询会请求服务器返回用户ID为1的用户名和电子邮件地址:

query {
  user(id: 1) {
    name
    email
  }
}

Mutation

Mutation用于在服务端修改或添加数据,类似于RESTful API的POST、PUT和DELETE方法。Mutation支持向服务端提交一些参数,并根据参数来执行相应的操作。

例如,以下Mutation会将用户ID为1的用户名更改为"NewName":

mutation {
  updateUser(id: 1, name: "NewName") {
    id
    name
    email
  }
}

Subscription

Subscription是GraphQL中的一种高级特性,它允许客户端通过WebSocket连接实时接收来自服务器的数据更新。这对于需要实时通知的应用程序非常有用,如在线聊天、股票报价等。

例如,以下Subscription会订阅一个名为newMessage的频道,并在有新消息时返回消息内容:

subscription {
  newMessage(channel: "chat") {
    content
    author
  }
}

GraphQL渗透测试方法和流程

  • 渗透测试准备工作
  • 渗透测试步骤
    • 枚举 GraphQL Schema
    • 查询漏洞
    • 注入漏洞
    • 认证和授权漏洞

常见的GraphQL路径

/graphql
/graphql-console
/graphql-devtools
/graphql-explorer
/graphql-playground
/graphql-playground-html
/graphql.php
/graphql/console
/graphql/graphql
/graphql/graphql-playground
/graphql/schema.json
/graphql/schema.xml
/graphql/schema.yaml
/graphql/v1
/HyperGraphQL
/je/graphql
/laravel-graphql-playground
/lol/graphql
/portal-graphql
/v1/api/graphql
/v1/graphql
/v1/graphql-explorer
/v1/graphql.php
/v1/graphql/console
/v1/graphql/schema.json
/v1/graphql/schema.xml
/v1/graphql/schema.yaml
/v2/api/graphql
/v2/graphql
/v2/graphql-explorer
/v2/graphql.php
/graph
/graphql/console/
/graphiql
/graphiql.php

内省攻击

内省攻击本质上来说就是因为没有修改默认配置导致攻击者可以通过查询 __schema 或者 __type 等系统级别的 Schema 来获取服务器上定义的所有类型、字段、枚举等信息。攻击者可以利用这些信息去了解服务器的数据结构和业务逻辑,为下一步的攻击行动做准备。

内省攻击包含以下几个方面:

  • 获取所有暴露的接口和类型信息:攻击者可以使用 __schema 查询来获取所有可用的 Schema 信息,包括对象类型、标量类型、枚举类型、接口类型和输入类型等。
  • 获取所有字段信息:攻击者可以通过 __type.fields 查询来获取所有字段信息,包括字段名称、类型和描述等。
  • 获取实际数据:攻击者可以通过查询实际数据,如用户账号、密码、秘密答案等,从而获取更高的权限或者直接篡改系统。

如下三段GraphQL 查询语句本质上是相同的,都是用于获取 GraphQL Schema 的元数据信息。它们的区别在于格式和编写方式

{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations 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 ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}
{"query": "query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations 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 ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}"}
{"query":"query Query {\n    __schema {\n      queryType { name }\n      mutationType { name }\n      subscriptionType { name }\n      types {\n        ...FullType\n      }\n      directives {\n        name\n        description\n        locations\n        args {\n          ...InputValue\n        }\n      }\n    }\n  }\n\n  fragment FullType on __Type {\n    kind\n    name\n    description\n    fields(includeDeprecated: true) {\n      name\n      description\n      args {\n        ...InputValue\n      }\n      type {\n        ...TypeRef\n      }\n      isDeprecated\n      deprecationReason\n    }\n    inputFields {\n      ...InputValue\n    }\n    interfaces {\n      ...TypeRef\n    }\n    enumValues(includeDeprecated: true) {\n      name\n      description\n      isDeprecated\n      deprecationReason\n    }\n    possibleTypes {\n      ...TypeRef\n    }\n  }\n\n  fragment InputValue on __InputValue {\n    name\n    description\n    type { ...TypeRef }\n    defaultValue\n  }\n\n  fragment TypeRef on __Type {\n    kind\n    name\n    ofType {\n      kind\n      name\n      ofType {\n        kind\n        name\n        ofType {\n          kind\n          name\n          ofType {\n            kind\n            name\n            ofType {\n              kind\n              name\n              ofType {\n                kind\n                name\n                ofType {\n                  kind\n                  name\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }"}

GraphQL渗透测试详解

可以使用burp的插件进行分析

GraphQL渗透测试详解

之后就可以查找其中一些漏洞了,比如修改ID参数查询其他人员信息

GraphQL渗透测试详解

如果graphql内省模式被禁用,可以尝试使用工具。

https://github.com/nikitastupin/clairvoyance

https://github.com/assetnote/batchql

GraphQL 渗透测试实战案例分析

消耗服务器资源攻击案例

我们首先请求一次该接口发现用时30481

GraphQL渗透测试详解

然后添加一个systemUpdate参数再次请求,可以看到时间变成了80725。如果添加更多的systemUpdate参数即可导致攻击发生。

GraphQL渗透测试详解

SSRF漏洞案例

GraphQL渗透测试详解

GraphQL渗透测试详解

防御和修复 GraphQL 漏洞的建议

  1. 限制查询语句的深度和复杂度:GraphQL 支持嵌套查询和参数化查询,这使得攻击者可以构造非常复杂的查询来增加服务器的负载,甚至可能导致拒绝服务攻击。为了防范此类攻击,可以对查询语句进行深度和复杂度限制,以确保每个查询不会占用过多的资源。
  2. 限制查询的访问权限:GraphQL API 应该只允许授权访问,而不是任何人都可以访问。可以通过身份验证、IP 白名单、API 密钥等方式来限制查询的访问权限,从而避免恶意查询和攻击。
  3. 限制查询返回的字段和数据量:攻击者可以利用查询返回大量的数据来耗尽服务器资源或者获取敏感信息。为了防止这种情况发生,应该限制每个查询返回的字段和数据量,并对某些敏感字段进行隐藏或者过滤处理。
  4. 检查输入参数的合法性:GraphQL 允许客户端自由传递参数,这也使得攻击者可以利用参数注入漏洞来攻击系统。因此,在服务器端需要对输入参数进行严格校验和过滤,避免恶意参数的注入和攻击。
  5. 关闭内省查询:GraphQL 内省机制被用来获取服务器上定义的所有类型、字段、枚举等信息。攻击者可以利用这些信息了解服务器的数据结构和业务逻辑,从而进行进一步攻击。为了防范此类攻击,应该关闭或限制内省查询功能。

参考

https://blog.yeswehack.com/yeswerhackers/how-exploit-graphql-endpoint-bug-bounty/

https://zhuanlan.zhihu.com/p/390876937

注:技巧,可以了解 GraphQL 模式的功能。{"query":"query {\n system\n}","variables":null}文章来源地址https://www.toymoban.com/news/detail-423836.html

到了这里,关于GraphQL渗透测试详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kali Linux渗透测试技术介绍【文末送书】

    对于企业网络安全建设工作的质量保障,业界普遍遵循PDCA(计划(Plan)、实施(Do)、检查(Check)、处理(Act))的方法论。近年来,网络安全攻防对抗演练发挥了越来越重要的作用。企业的安全管理者通过组织内部或外部攻击队,站在恶意攻击者的视角,识别自身网络安

    2024年02月09日
    浏览(45)
  • 2023年8大在线渗透测试工具介绍与分析

    随着企业参与数字化运动,网络安全已成为大多数董事会讨论的一个重要方面。事实上,最近的一份报告显示,2022 年网络犯罪造成的损失总额达到惊人的 103 亿美元。 这就是在线渗透测试工具在网络安全中受到关注的地方。 今天,我们希望引导您了解在线渗透测试的重要性

    2024年02月09日
    浏览(37)
  • 内网渗透代理转发详解及工具介绍

    介绍一下个人网站 欢迎各位大佬光顾 http://www.sec0nd.top 在进行渗透测试时,getshell打点之后就要进行内网渗透了,那么为了更方便的进行横向移动,需要做代理转发。今天来了解下代理转发以及相关的工具。 代理有两种形式, 映射和转发 ,最终的表现形式均为代理 端口映射

    2024年02月11日
    浏览(49)
  • 【APP渗透测试】Android APK常用测试工具(Drozer)安装及使用方法介绍

    本篇文章主要介绍 Drozer Android测试工具的安装以及简单使用,后续会持续更新更多使用方法。 Drozer 是 MWR Labs 开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。其官方文档说道: Drozer允许你一个普通Android应用的身份与其他应用和操作系统交互。 在Web世界

    2024年02月16日
    浏览(48)
  • 《渗透测试》-前期信息收集及工具介绍01(信息收集简介、JSFinder、OneForAll)

    信息收集是指通过各种方式获取所需要的信息,以便我们在后续的渗透过程更好的进 行。比如目标站点IP、中间件、脚本语言、端口、邮箱等等。信息收集包含资产收集 但不限于资产收集。 1、信息收集是渗透测试成功的保障 2、更多的暴露面 3、更大的可能性 1、主动信息收

    2024年02月03日
    浏览(55)
  • VulnHub Jangow:1.0.1 渗透测试练习详解

    本文详细记录了对VulnHub Jangow:1.0.1的渗透测试过程,包括信息收集、FTP登录、后门连接、反弹shell、切换用户、提升权限等步骤,适合渗透测试练习和学习。

    2024年01月18日
    浏览(86)
  • Kali Linux 2022.4虚拟机中常用的渗透测试工具介绍

    数据来源: ChatGPT         Kali Linux 2022.4虚拟机中自带了大量渗透测试工具,涵盖了信息收集、漏洞利用、口令破解、漏洞扫描等多个方面。         使用方法只能当做参考, 详细的使用教程: 建议您在搜索引擎上输入相关,例如: \\\"Kali Linux 工具名 中文教程

    2024年02月05日
    浏览(46)
  • 渗透测试学习(一)—— Kali Linux的安装图文详解

    目录 一、Kali Linux 2022.4镜像下载 二、VMware 安装 Kali 镜像 安装版的Kali 免安装版Kali官方VMware镜像 打开Kali官网 www.kali.org 点击Download跳转到下载界面,这里我们选择虚拟机版本,博主采用的是VMware虚拟环境搭建,选择合适的下载方式。 直接下载可能比较慢,我们可以选择torre

    2024年02月02日
    浏览(71)
  • 网络安全B模块(笔记详解)- Web渗透测试

    1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令行模式,通过输入命令

    2024年01月25日
    浏览(52)
  • 【十年网络安全工程师整理】—100渗透测试工具使用方法介绍

     渗透测试是指渗透人员在不同的位置(比如从内网、从外网等位置)利用各种手段对 某个特定网络进行测试,以期发现和挖掘系统中存在的漏洞,然后输出渗透测试报告, 并提交给网络所有者。网络所有者根据渗透人员提供的渗透测试报告, 可以清晰知晓系统中存在的安

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包