Facebook开发的一种数据查询语言——GraphQL:安全概述和测试技巧

本文涉及的产品
访问控制,不限时长
简介:

随着GraphQL技术越来越受欢迎,我们总结了一些关于常见安全错误的概述和技巧。

GraphQL是什么?

GraphQL是Facebook开发的一种数据查询语言,并于2015年公开发布。它是REST API的替代品。

即使你从没见过GraphQL,但可能你已经在使用它了,因为一些知名度很高的科技巨头将其运用在了他们的线上软件里,如Facebook, GitHub, Pinterest, Twitter, HackerOne等等。

关于这项技术的几个关键点

· GraphQL提供了API中数据的完整性和描述的可理解性,并为客户提供了准确描述其所需的能力。查询总是返回可预测的结果。

· 典型的REST api需要从多个url加载,而GraphQL api可以在单个请求中获取应用程序所需的所有数据。

· GraphQL API是按照类型和字段组织的,不是端点。可以从单个端点访问所有数据的全部功能。

· GraphQL是强类型的,以确保应用程序只对可能的内容发出请求,并提供清晰和有用的错误。

· 新的字段和类型可以添加到GraphQL API,而不影响现有查询。老化的字段可以被弃用,并且隐藏在工具中。

在我们开始研究GraphQL安全环境之前,简要回顾一下它是如何工作的。官方文件内容全面,很有帮助。

GraphQL查询如下所示:

基本GraphQL查询

query{
 user{
 id
 email
 firstName
 lastName
 }
}

而响应是JSON:

基本GraphQL响应

{
 "data": {
 "user": {
 "id": "1",
 "email": "paolo@doyensec.com",
 "firstName": "Paolo",
 "lastName": "Stagno"
 }
 }
}

安全性测试技巧

由于Burp Suite不识别GraphQL语法,我推荐使用graphql-ide,这是一个基于Electron的应用程序,允许编辑和发送请求到GraphQL端点;我还编写了一个小python脚本GraphQL_Introspection.py列举了一个GraphQL端点(带有内省),以便提取文档。该脚本可用于检查GraphQL模式,查找信息泄漏、隐藏的数据以及不再访问的字段。

该工具将生成一个类似于下面的HTML报告:

Facebook开发的一种数据查询语言GraphQL:安全概述和测试技巧

内省用来请求一个GraphQL模式,来获取关于它所支持的查询、类型等的信息。

作为一个pentester,我建议查找发送到“/graphql”或“/graphql”的请求。因为这些通常是GraphQL的端点名称;还应该搜索“/graphiql”、“graphql/console/”、与后端交互的在线GraphQL IDE,以及 “/graphql.php?debug=1”(附加错误报告的调试模式),因为这些可能会被开发人员以打开的状态搁置。

在测试应用程序时,验证是否可以在没有通常的授权令牌头的情况下发出请求:

Facebook开发的一种数据查询语言GraphQL:安全概述和测试技巧

由于GraphQL框架没有提供任何方法来保护你的数据,开发人员负责实现文档中所述的访问控制:

但是,对于产品代码库来说,将授权逻辑委托给业务逻辑层。

这可能会出现错误,因此需要验证没有适当身份验证和/或授权的用户是否可以从服务器请求整个底层数据库。

在使用GraphQL构建应用程序时,开发人员必须将数据映射到所选数据库技术中的查询。这就是安全漏洞很容易被引入的地方,导致访问控制的中断、不安全的直接对象引用,甚至SQL/NoSQL注入。

作为一个中断实现的示例,以下请求/响应表明我们可以为平台的任何用户获取数据(通过ID参数循环),同时转储密码哈希:

查询

query{
 user(id: 165274){
 id
 email
 firstName
 lastName
 password
 }
}

响应

{
 "data": {
 "user": {
 "id": "165274",
 "email": "johndoe@mail.com",
 "firstName": "John",
 "lastName": "Doe"
 "password": "5F4DCC3B5AA765D61D8327DEB882CF99"
 }
 }
}

另一件你需要检查的事情是在试图执行非法查询时的相关信息披露:

信息披露

{
 "errors": [
 {
 "message": "Invalid ID.",
 "locations": [
 {
 "line": 2,
 "column": 12
 }
 "Stack": "Error: invalid ID\n at (/var/www/examples/04-bank/graphql.php)\n"
 ]
 }
 ]
}

尽管GraphQL是强类型的,但是SQL/NoSQL注入仍然是可能的,因为GraphQL只是客户应用程序和数据库之间的一层。问题可能存在于为了从GraphQL查询中提取变量所开发的层中,开发该层的目的是询问数据库;没有正确检查的变量会导致较老的简单SQL注入。对于Mongodb, NoSQL注入可能不是那么简单,因为我们不能“处理”类型(例如,将字符串转换成数组。请参阅PHP MongoDB注入)。

GraphQL SQL注入

mutation search($filters Filters!){
 authors(filter: $filters)
 viewer{
 id
 email
 firstName
 lastName
 }
}
 
{
 "filters":{
 "username":"paolo' or 1=1--"
 "minstories":0
 }
}

谨防嵌套查询!该查询允许带有恶意的客户端通过过度复杂的查询执行DoS(拒绝服务)攻击,该攻击将消耗服务器的所有资源:

嵌套查询

query {
 stories{
 title
 body
 comments{
 comment
 author{
 comments{
 author{
 comments{
 comment
 author{
 comments{
 comment
 author{
 comments{
 comment
 author{
 name
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
}

可以设置一个超时、最大深度或查询复杂性阈值,对DoS攻击进行一个简单的补救。

在PHP GraphQL实现中请谨记:

· 默认情况下禁用复杂性分析。

· 默认情况下禁用限制查询深度。

· 默认情况下内省是启用的。这意味着任何人都可以通过发送包含元字段类型和模式的特殊查询来获取对你的模式的完整描述。

总结

GraphQL是一种新的有趣的技术,它可以用来构建安全的应用程序。由于开发人员负责实现访问控制,所以用其构建的应用程序容易受到传统web应用程序的攻击,如破坏访问控制、不安全的直接对象引用、跨站脚本(XSS)和典型的注入错误。与其他任何技术一样,基于GraphQL的应用程序可能容易出现开发实现错误,比如下面这个真实的例子:

通过使用一个脚本,整个国家(我测试了美国、英国和加拿大)可能的数字组合可以通过这些url来运行,并且如果一个数字与Facebook账户相关联,那么它就很可能与一个名字和更多的细节(图像,等等)有联系。


原文发布时间为:2018-05-27
本文来自云栖社区合作伙伴“ 嘶吼网”,了解相关信息可以关注“ 嘶吼网”。
相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
9天前
|
缓存 运维 数据库
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
本文分享了作者作为测试人员如何利用专业技能转向开发来兼职赚钱的经验,包括分析和解决登录页面跳转、避免重复账号注册、用户登录后首页显示用户名以及添加退出功能等问题,并提供了Django项目中使用sqlite3数据库和后台管理的扩展技巧。
28 1
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
|
12天前
|
Java 测试技术 开发者
在软件开发中,测试至关重要,尤以单元测试和集成测试为然
在软件开发中,测试至关重要,尤以单元测试和集成测试为然。单元测试聚焦于Java中的类或方法等最小单元,确保其独立功能正确无误,及早发现问题。集成测试则着眼于模块间的交互,验证整体协作效能。为实现高效测试,需编写可测性强的代码,并选用JUnit等合适框架。同时,合理规划测试场景与利用Spring等工具也必不可少。遵循最佳实践,可提升测试质量,保障Java应用稳健前行。
27 1
|
9天前
|
测试技术 API
软件测试:Postman 工具的使用。开发及测试均需要掌握的测试工具
这篇文章详细介绍了Postman工具的各个模块功能,包括创建请求、集合、环境、自动化测试等,并解释了如何使用Postman进行GET、POST、PUT和DELETE等常见HTTP请求的测试。
|
18天前
|
运维 Kubernetes 监控
|
23天前
|
机器学习/深度学习 人工智能
高于临床测试3倍准确率!剑桥大学开发AI模型,提前6年预测阿尔茨海默症
【8月更文挑战第9天】剑桥大学研发的人工智能模型在预测阿尔茨海默症方面取得突破,准确率比传统临床测试高三倍,能提前六年预测疾病发生。该模型基于深度学习,利用大量临床及神经影像数据识别生物标志物,预测准确性达80%。这一成果有望促进早期干预,改善患者预后,但仍需更大规模研究验证,并解决隐私与公平性等问题。论文已发表于《The Lancet》子刊。
32 6
|
2月前
|
Java 编译器 运维
开发与运维测试问题之在JVM中方法区也被称之为什么如何解决
开发与运维测试问题之在JVM中方法区也被称之为什么如何解决
18 1
|
2月前
|
Java 开发者 运维
开发与运维测试问题之OpenJDK官方还未正式发布Compact Object Headers如何解决
开发与运维测试问题之OpenJDK官方还未正式发布Compact Object Headers如何解决
29 1
|
2月前
|
测试技术 Shell Go
Golang质量生态建设问题之Go语言的单元测试的问题如何解决
Golang质量生态建设问题之Go语言的单元测试的问题如何解决
|
4天前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~
|
7天前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~

热门文章

最新文章

下一篇
云函数