重生之我是赏金猎人(五)-多手法绕过WAF挖掘某知名厂商XSS

0x00 项目背景

该系列旨在分享自己和团队在SRC、项目实战漏洞测试过程中的有趣案例,如果读者能从本项目习得一些有用的知识,那么笔者将非常荣幸。

该系列首发github:https://github.com/J0o1ey/BountyHunterInChina
本项目由M78sec维护,未经授权,文章严禁私自修改版权转载。

0x01 前奏

近在测试某知名安全⼚商的过程中,发现其⼀处重要业务的⼦域竟出现了难得⼀⻅的⾃研WAF,如此⼀来勾起了我的兴趣~
在这里插入图片描述

仔细研究该业务点后,发现某处传参,会直接将传参内容写⼊JS中,⼤⼤的危险在这里插入图片描述
于是与WAF的⼀次交锋便从此刻开始~

0x02 平静的闭合与常规操作

由上图的输出位置可知,无WAF情况下,我们只需要通过

’)]

三个符号来闭合前半部分JS,再用//注释后方JS,再直接eval执行JS代码即可构造Payload

%27)];eval(alert('xss'))//

在这里插入图片描述
由于eval,alert,括号等太敏感~毫无疑问,直接被WAF秒了
那只能用经验与思路来逐渐替换掉这些敏感的函数关键词了~

0x03 多手法组合绕过WAF

⾸先解决的是eval被拦截的问题
在JS中绕过对于eval的拦截,可以使⽤Function()动态构造函数
这⾥⽤到了 Function()构造函数的⼀个特性, Function()构造函数虽然不是很常⽤,但是了解⼀下还是很有必要的。
不管是通过函数定义语句还是函数直接量表达式,函数的定义都要使⽤ function()关键字。
但是单函数还可以通过Function()构造函数来定义,⽐如:

varf=newFunction("x","y","return x*y");

这一行的实际效果和下面的一行代码是等价的

varf=function(x,y){x*y};

Function()构造函数可以传入任意数量的字符串实参,最后一个实参所表示的文本是函数体;它可以包含任意的Javascript 语句,每条语句之间用分号分割。
我们依据这个特性就可以使用Function()来代替eval()
EG:

Function(alert('xss'))
eval(alert('xss'))

两者是等效的
在这里插入图片描述
改造我们的Payload

?%27]);Function(test)()//

发现未拦截
在这里插入图片描述
直接Function内使用函数

%27]);Function(alert('xss'))()//

不出意外,直接GG了~在这里插入图片描述
下面思考的就是如何绕过对于函数的检测

绕过函数检测直接alert既然被拦截,我们就使用atob来解密base64的的JSEG:

atob("YWxlcnQoInhzcyIp")  //base64编码的alert('xss')

构造Payload

%27]);Function(atob('YWxlcnQoInhzcyIp')))()//

在这里插入图片描述
Md,又寄了~估计是正则检测了atob + ()的函数使用…没事,再用JS的一个特性,反引号来代替括号+引号

atob`YWxlcnQoInhzcyIp`

在这里插入图片描述

构造Payload

%27]);Function(atob`YWxlcnQoInhzcyIp`)()//

在这里插入图片描述

`0x04 总结

本初XSS绕过WAF总共用了四个简单的TIPS
1.输出在JS内的闭合与注释
2.Function()来代替eval()
3.atob解密base64加密的JS
4.反引号代替括号与引号`

所以,大多数业务场景并不是没有漏洞,大部分情况是受挖掘者脑中的利用链与姿势所限。各种小手法组合起来达到漏洞利用成功的效果,是一次有趣的经历

本文作者: J0o1ey

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值