网络安全 频道

浅析XSS(Cross Site Script)漏洞原理

    二、XSS转码引发的过滤问题

    有攻就有防,网站程序员肯定不会放任大家利用XSS,所以他们常会过滤类似javascript的关键字符,让大家构造不了自己的XSS,我这里就捡两个被忽略惯了的字符来说,它们是"&"和"\".首先来说说"&"字符,玩过SQL注入的都知道,注入的语句可以转成16进制再赋给一个变量运行,XSS的转码和这个还真有异曲同工之妙,原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值,下面我就拿<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&#88&#83&#83&#39&#41&#59"> //10进制转码 如图三

    <img src="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29&#x3b"> //16进制转码。

    这个&#分隔符还可以继续加0变成“&#0106” ,“&#00106” ,“&#000106” ,“&#0000106”等形式。

    而这个"\"字符却暴露了一个严重的XSS 0DAY漏洞,这个漏洞和CSS(Cascading Style Sheets)层叠样式表有很大的关联,下面我就来看看这个漏洞,先举个javascript的eval 函数的例子,官方是这样定义这个函数:

    eval(codeString),必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript 分析器进行分析和执行。

    我们的JavaScript中的"\"字符是转义字符,所以可以使用"\"连接16进制字符串运行代码

    <SCRIPT LANGUAGE="JavaScript">
eval("\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28\x22\x58\x53\x53\x22\x29")
</SCRIPT>

0
相关文章