【安全记录】玩转GraphQL - DVGA靶场(下)

admin 2023年5月16日08:07:59评论26 views字数 1985阅读6分37秒阅读模式

上篇文章介绍了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}')

可以通过

``
||
;;
&&

等方式拼接执行命令:

【安全记录】玩转GraphQL - DVGA靶场(下)

3.2 systemDiagnostics

本篇文章补充一个命令执行的功能点,可以算是后台命令执行。

通过分析源码文件,在core/views.py文件中,Query类 - resolve_system_diagnostics方法,对应 query 接口 systemDiagnostics ,cmd接收参数进行命令执行。

【安全记录】玩转GraphQL - DVGA靶场(下)

在执行命令前,会进行鉴权校验,只有提供正确的登录凭证,我们才能执行命令。

可以使用burp的intruder模块进行爆破,得到正确的密码:

【安全记录】玩转GraphQL - DVGA靶场(下)

该靶场存在两个挑战难度,BeginnerExpert,通过X-DVGA-MODE请求头进行控制。当难度为Expert时,就会受到源码文件中security.allowed_cmds(cmd),而无法执行命令:

【安全记录】玩转GraphQL - DVGA靶场(下)

4. 注入

4.1 存储型XSS

GraphQL 的 createPaste 和 importPaste 允许创建和导入新的paste。paste可以包括任何字符而没有任何限制。这些内容会在公共和私有粘贴页面中呈现,这将导致存储型XSS漏洞。

【安全记录】玩转GraphQL - DVGA靶场(下)

对应的请求包为:

【安全记录】玩转GraphQL - DVGA靶场(下)

访问时,执行而已JS代码:

【安全记录】玩转GraphQL - DVGA靶场(下)

5. 鉴权绕过

5.1 /graphiql 接口绕过鉴权

该靶场存在/graphiql并且可以执行相关查询操作,但较危险的操作被禁止了,比如下方的命令执行操作就被禁止了:

【安全记录】玩转GraphQL - DVGA靶场(下)

通过观察请求白中的cookie,我们发现env cookie是经过base64编码的:

【安全记录】玩转GraphQL - DVGA靶场(下)

Z3JhcGhpcWw6ZGlzYWJsZQ==

对应的明文字符为:

graphiql:disable

尝试将 graphiql:enable base64 编码:Z3JhcGhpcWw6ZW5hYmxl,替换cookie,借此可以绕过限制,执行危险操作。

【安全记录】玩转GraphQL - DVGA靶场(下)

6. 任意文件写入 / 目录遍历

uploadPaste 这个 mutation 允许我们上传本地文件作为paste的内容。

【安全记录】玩转GraphQL - DVGA靶场(下)

该上传过程的请求包:

【安全记录】玩转GraphQL - DVGA靶场(下)

filename 参数未经过任何过滤,我们可以使用../将文件内容写到服务器上的任何位置。

【安全记录】玩转GraphQL - DVGA靶场(下)

成功写入文件到目标服务器/tmp目录下:

【安全记录】玩转GraphQL - DVGA靶场(下)

由此,我们可以写入计划任务文件.ssh公钥文件等内容控制服务器。

7. 利用工具 - inql

项目地址:https://github.com/doyensec/inql

inql 是一种用于促进 GraphQL 技术安全审计工作的安全测试工具。

它可以作为工具单独运行,也可以作为burp插件辅助使用,我更偏向于作为burp插件使用。

安装好该burp插件后,burp状态栏会多出InQL ScannerInQL Timer两栏。

7.1 基本使用

这个工具对于非80端口的url不支持。 挖个坑,有时间学习下这个插件的源码,将这个不足之处修正。

http://dvga:5000/graphql 就不能load。

该工具只能使用80端口。

在顶部输入字段中加载 GraphQL 端点或 JSON 架构文件位置,点击load按钮:

【安全记录】玩转GraphQL - DVGA靶场(下)

选择任何 query/mutation/subscription 将在主文本区域加载相应的模板:

【安全记录】玩转GraphQL - DVGA靶场(下)

7.2 发送到burp repeater模块

【安全记录】玩转GraphQL - DVGA靶场(下)

就可以直接在repeater模块中操作数据包了:

【安全记录】玩转GraphQL - DVGA靶场(下)

7.3 发送到 GraphiQL

前面我们介绍了graphiql是一个UI良好的工具,该插件也提供了这个功能,我们可以将相关请求包发送到该插件提供的graphiql接口处:

【安全记录】玩转GraphQL - DVGA靶场(下)

其会在浏览器打开一个graphiql界面,查询请求:

【安全记录】玩转GraphQL - DVGA靶场(下)

参考链接

https://mp.weixin.qq.com/s/gp2jGrLPllsh5xn7vn9BwQ

https://www.yuque.com/henry-weply/penetration/ps5n3g

http://lzltool.com/Escape/StringEscape


原文始发于微信公众号(信安文摘):【安全记录】玩转GraphQL - DVGA靶场(下)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月16日08:07:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【安全记录】玩转GraphQL - DVGA靶场(下)http://cn-sec.com/archives/866751.html

发表评论

匿名网友 填写信息