今天看到有公众号发了yapi的利用了,团队师傅之前已经分析好了,某些未知因素,就扔在星球了也没有发出来。不过目前已经出来详情了都出来了,现在发问题应该也不大,索性就发出来了。
利用文章 ,可以参考https://mp.weixin.qq.com/s/UTMly3wLfK0SQHOj5CcN8w
Yapi前台注⼊到RCE分析
获取token
直接来看看1.11.0版本修改了什么:
可以看到在base.js⾥添加了token类型判断,因此直接看看if⾥到底做了什么:可以看到如果path为oepnApiRouter⾥的任意⼀个或者以/api/open/开头就进⼊if,然后解析token
出错后进⼊getProjectIdByToken,继续跟⼊:此处可以看到直接将token放⼊进⾏查询,由于yapi⽤的mongodb,因此可以⽤json格式结合正则来跑出token,这⾥注⼊还是很简单也容易看到的,此漏洞主要在于拿到这个token后如何造成代码执⾏,接着往下看。
构造admin token
在server/controllers/base.js,如果使⽤checkId的⽅式Uid就为固定的99999,但是要想构造uid,就需要进⼊else部分,也就是要通过parseToken:
先看parseToken,从参数中传⼊的token是要进⾏aes解密,然后通过'|'分割来获取uid和projectToken的,projectToken也就是我们上⼀步中获取的token:
passsalt默认是没有设置的,所以aes的passsalt固定为'abcde',所以可以构造⼀个uid,projectToken然后加密就可以构造⼀个有效的token
通过构造这个token,经过parseToken后就可以解析到uid和projectToken,此处projectToken只要是任意⼀个存在到即可,关键在于这个uid,在后续漏洞利⽤很重要。
调⽤Pre-request Script或Pre-response Script
代码执⾏的关键就在于存在接⼝可以使⽤上⼀步构造的token上传Pre-request Script或Preresponse Script;这两个script同样可以执⾏脚本,和mock类似,但是这种⽅式可以通过token的⽅式绕过鉴权;另外,mock在新版中已不再使⽤vm沙箱,换为了更为安全的safeify沙箱,因此mock从各种⻆度来看都不能作为RCE的点,⽽这两个script⽤的正好是可以逃逸的vm沙箱:
但是此接⼝在这个位置校验了权限,所以⾸先要通过这个鉴权:
跟进去发现必须为admin或者owner
接着看怎么获取role的
发现输⼊的id必须和构造的token解密后的uid⼀致才可以,但是uid可以通过上⼀步设置,id此处也可控,就可以绕过权限校验了。
然后找到同样是可以⽤token鉴权的runautotest接⼝执⾏测试⽤例触发pre_script,下⾯看runautotest接⼝的逻辑:
⼀路⾛下来最终在此处⽤sandbox执⾏我们上传的Script
接着看sandbox是如何⽣成的:
发现⽤的是vm沙箱,vm沙箱可以逃逸,直接命令执⾏。另外,命令执⾏的回显结果可以放在requestBody参数中,即可在测试⽤例报告中看到命令执⾏结果;当然换其他参数也可以,还有其他⼏个,requestBody只是其中⼀个。
这里执行了一个回显的payload,大概如下
可以写一个payload进行回显集成,大概是这样子的效果,这里爆破了一下prokectid和colid因为我本地复现的时候发现不一样,索性就直接遍历跑了一下,看哪一个执行成功了。
原文始发于微信公众号(e0m安全屋):yapi分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论