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:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
21天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
150 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
18天前
|
传感器 安全 物联网
阿里云先知安全沙龙(北京站) ——车联网安全渗透测试思路分享
本文介绍了智能汽车的整车架构、协议栈结构、攻击点分析、渗透思路及案例分享。整车架构涵盖应用层、协议层和物理层,详细解析各层次功能模块和通信机制。攻击点包括Wi-Fi、USB、NFC等,展示车辆通信接口和系统组件的安全风险。渗透思路从信息收集到系统内部探索,利用固件漏洞控制车辆功能。案例展示了网段隔离不足导致的SSH访问和OTA日志审计漏洞,揭示了潜在的安全威胁。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
74 1
|
2月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
56 2
|
2月前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
2月前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
3月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
89 2
|
2月前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
2月前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
2月前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS