GraphQL – 攻击和安全
GraphQL 是一种 API 查询语言,它使用图结构来存储数据。它就像任何其他 REST API 现在 GraphQL 实现在应用程序开发中非常普遍。 Facebook、Yahoo、Shopify、Twitter 等科技公司也实施了 GraphQL 来进行内部通信、变异和数据删除。
通常,当开发人员编写 API 时,他们会为各种操作编写大量端点。在下面的示例中,显示了应用程序如何使用各种 REST API 端点来访问不同的服务
- 获取 /api/resource_1
- 获取 /api/resource_2
- 发布 /api/resource_1
这会产生多个端点,每个资源每个 CRUD(创建、读取、更新、删除)操作一个端点,用于事后、评论、用户数据、文件,但GraphQL是一种特殊类型的 API,我们必须管理和使用只有一个端点。通常,我们以具有行和列的电子表格形式表示数据,但在 Web 应用程序中,我们要求所有数据相互链接,并且这些数据的自然形式是图形。 GraphQL 在新应用中更为常见。
GraphQL 具有查询、变异、片段和元字段等功能,所有这些功能使 GraphQL 非常强大,有助于以有组织和更简单的方式获取、更新和删除数据。查询使用起来很灵活,通过使用查询,我们可以请求任何实体,包括相关实体和与该实体关联的字段。查询被编写为一个可以返回一个或多个值的函数,我们也可以包含参数。
例子:
REQUEST:-
{
student {
name,
id,
password
}
}
RESPONSE:-
{
"data": {
"student": {
"name": "Siddhant"
"id" : "112"
"password" : "GFG2020"
}
}
}
GraphQL 的工作:
有两个核心部分决定了 GraphQL 的工作方式:
- 架构
- 解析函数
架构:
GraphQL 中的模式是可以从服务器查询的数据模型。它设置客户端可以进行的有效和授权查询的类型。
看看下面的 GraphQL 模式符号:
type Employee {
id: Int
name: String
posts: [Post]
}type Salary{
id: Int
title: String
Amount: Int
employee: Employee
}type Query {
getEmployee(id: Int): Employee
getSalary(titleContains: String): [Post]
}schema {
query: Query
}
在上述模式中,有 3 种类型,即 Employee、Salary 和 Query。在这里,查询标记了模式的入口点。所有查询都必须以getEmployee或getSalary 开头才能进行验证。此外,Employee 和 Salary 对象相互引用。
解析函数:
GraphQL 中的解析函数的作用类似于路由器。他们负责在 GraphQL 模式中建立字段和类型之间的关系。这些功能与所有类型的后端甚至其他 GraphQL 服务器兼容。示例解析函数如下所示:
getEmployee(_, args){
return sql.raw('SELECT * FROM Employee WHERE id = %s', args.id);
}Salary(employee){
return request(`https://YOUR_URL/${employee.id}`);
}
注意:不建议在 resolve函数中直接写 query 和 URL。
测试 GraphQL 错误的方法:
1.内省:
自省是 GraphQL 的奇怪特性之一。这对于在 API 测试期间进行自省非常重要。在 GraphQL 中,它提供了有关 GraphQL 实现的大量信息。与graphql端点相关的三个最常见的错误是业务逻辑错误、IDORS、信息泄露和防火墙绕过。 GraphQL API 专门位于qql、graphql、console、graphilq等特定端点。graphql搜索中最难的部分是在理解实现的语法之后理解语法,我们可以轻松地继续测试 GraphQL API。
- 拦截要测试的 HTTP 请求
- 将查询内容替换为 POST 请求中的通用自省查询
- 在不同的端点上尝试相同的过程
- 如果您收到 200 个 OK 响应,那么您将在响应正文中获得一些内部数据库。
- 使用Inql burp 套件扩展了解 GraphQL 的实现
2、限速不足:
始终检查 API 端点上的速率限制是否不足。可能会强制 GraphQL 查询从后端服务器获取信息。攻击者可能会暴力破解密码重置端点上的密码重置令牌来更改受害者的密码,这种小攻击会导致完整的帐户接管漏洞。限速保护实施不力会导致 DDos 攻击,从而导致服务器宕机。
3. CRUD 功能中缺少验证:
在应用程序中,创建、读取、更新和删除是最重要和最关键的功能。 GraphQL 在使用时看起来非常简单,但从实现的角度来看却有些复杂。在执行每个功能期间始终使用授权令牌。每个令牌必须是唯一的。要检查此错误,请通过更改查询参数(如用户名、用户 ID 等)检查每个功能。如果它为操纵的请求提供 SUCCESS 结果,则 CRUD 功能中缺少验证。
测试 GraphQL 安全性的工具:
- GraphQL 航海者
- Inql burp 套件扩展
- GraphQL 路径枚举