上篇文章介绍了GraphQL靶场的一些基本漏洞:https://mp.weixin.qq.com/s/WoHEC50u7KACLLafZL5tww
本篇继续介绍该靶场的一些漏洞。
3. 代码执行
3.1 importPaste
在上面介绍SSRF的导入paste功能处,通过分析源码,发现此处还存在代码注入漏洞,接收输入,拼接到curl --insecure
命令后面并执行系统命令:
core/views.py ImportPaste类中
def mutate(self, info, host='pastebin.com', port=443, path='/', scheme="http"):
url = security.strip_dangerous_characters(f"{scheme}://{host}:{port}{path}")
cmd = helpers.run_cmd(f'curl --insecure {url}')
可以通过
``
||
;;
&&
等方式拼接执行命令:
3.2 systemDiagnostics
本篇文章补充一个命令执行的功能点,可以算是后台命令执行。
通过分析源码文件,在core/views.py
文件中,Query类 - resolve_system_diagnostics
方法,对应 query 接口 systemDiagnostics
,cmd接收参数进行命令执行。
在执行命令前,会进行鉴权校验,只有提供正确的登录凭证,我们才能执行命令。
可以使用burp的intruder
模块进行爆破,得到正确的密码:
该靶场存在两个挑战难度,Beginner
和 Expert
,通过X-DVGA-MODE
请求头进行控制。当难度为Expert
时,就会受到源码文件中security.allowed_cmds(cmd)
,而无法执行命令:
4. 注入
4.1 存储型XSS
GraphQL 的 createPaste 和 importPaste 允许创建和导入新的paste。paste可以包括任何字符而没有任何限制。这些内容会在公共和私有粘贴页面中呈现,这将导致存储型XSS漏洞。
对应的请求包为:
访问时,执行而已JS代码:
5. 鉴权绕过
5.1 /graphiql
接口绕过鉴权
该靶场存在/graphiql
并且可以执行相关查询操作,但较危险的操作被禁止了,比如下方的命令执行操作就被禁止了:
通过观察请求白中的cookie,我们发现env
cookie是经过base64编码的:
Z3JhcGhpcWw6ZGlzYWJsZQ==
对应的明文字符为:
graphiql:disable
。
尝试将 graphiql:enable
base64 编码:Z3JhcGhpcWw6ZW5hYmxl
,替换cookie,借此可以绕过限制,执行危险操作。
6. 任意文件写入 / 目录遍历
uploadPaste
这个 mutation 允许我们上传本地文件作为paste的内容。
该上传过程的请求包:
filename
参数未经过任何过滤,我们可以使用../
将文件内容写到服务器上的任何位置。
成功写入文件到目标服务器/tmp
目录下:
由此,我们可以写入计划任务文件
、.ssh公钥文件
等内容控制服务器。
7. 利用工具 - inql
项目地址:https://github.com/doyensec/inql
inql 是一种用于促进 GraphQL 技术安全审计工作的安全测试工具。
它可以作为工具单独运行,也可以作为burp插件辅助使用,我更偏向于作为burp插件使用。
安装好该burp插件后,burp状态栏会多出InQL Scanner
和 InQL Timer
两栏。
7.1 基本使用
这个工具对于非80端口的url不支持。 挖个坑,有时间学习下这个插件的源码,将这个不足之处修正。
http://dvga:5000/graphql
就不能load。
该工具只能使用80端口。
在顶部输入字段中加载 GraphQL 端点或 JSON 架构文件位置,点击load按钮:
选择任何 query/mutation/subscription 将在主文本区域加载相应的模板:
7.2 发送到burp repeater模块
就可以直接在repeater模块中操作数据包了:
7.3 发送到 GraphiQL
前面我们介绍了graphiql是一个UI良好的工具,该插件也提供了这个功能,我们可以将相关请求包发送到该插件提供的graphiql接口处:
其会在浏览器打开一个graphiql界面,查询请求:
参考链接
https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ