可以通过vulhub项目中的,vulhub/yapi/unacc
来一键搭建环境
初始化管理员账号成功,账号名:"admin@admin.com[1]",密码:"ymfe.org"
启动后,需要创建一个项目,并且初始化一个token,要不然表里没有token,sql注入也跑不出来
看微步的公众号可以知道是一个SQL注入和沙箱逃逸的组合拳
看github diff记录,可以看到修复方式是判断输入的类型是否是string,然后当时还是蒙了一会,因为接触的注入都是,php直接拼接用户参数导致的,但是这种的payload本质上都是string的。
把token带入数据库查询
后来想了一会,猜到了是数组,但是按php的思路a[0]=0&a[1]=1,然后就想到了js中常用的json格式,但是yapi里面get是没法传递json格式的参数的。
在文档里面找使用了token,并且POST、type为json的接口,可找到如下接口
然后搜索一下了mongodb的注入姿势,可以使用$regex来盲注,刚好我们这里是一个布尔型的盲注。
import requests
可以浅浅跑出一个token,基本上和微步里面的exp脚本对上了。
当时漏洞刚出来的时候就分析到这步了。
然后就是考虑命令执行,还是来看diff,这个地方判断了script是否开启。
那么就要看写在哪里的脚本,会走到这里执行,发现这里是写在crossRequest
,而调用这个函数的只有
而且handletest又是被runautotest调用的
接口里面就有这么一个功能
这个根据代码来看我用来跑测试用例的,所以我们先在项目中添加一个测试用例,在请求配置里面写上我们的脚本
然后发送请求测试一下
可以发现已经断下来了,后续会将我们的代码放入到sandbox中执行了。
到此整体漏洞利用流程就出来了。
注入获取token->添加任意测试用例->修改项目Pre-response Script脚本->调用/api/open/run_auto_test,完成RCE。
目前已经完成获取用户token了,接下来实现添加测试用例
可以利用接口 /api/interface/add
,来实现添加测试用例,这个接口需要如下参数
首先我们来尝试获取project_id,可以通过/api/project/get
这个接口,需要token。但是对比后台的token,和我们爆破出来的token是长度不一致的
看parseToken这个函数,可以发现后台的token是uid+真实token再加aes加密的,并且salt是固定的
现在我们知道了真实的token,但是不知道uid。但是uid的递增的,直接爆破就行。
from Crypto.Cipher import AES
效果如下
有了这些信息既可以添加测试用例
设置payload
然后运行autorun即可
这里的id,也可以通过接口来获取,我这里直接burp暴力跑了,成功创建flag