浅析XSS(Cross Site Script)漏洞原理2
- 第1页:XSS的触发条件
- 第2页:XSS转码引发的过滤问题
- 第3页:XSS漏洞的防范
二、XSS转码引发的过滤问题
有攻就有防,网站程序员肯定不会放任大家利用XSS,所以他们常会过滤类似javascript的关键字符,让大家构造不了自己的XSS,我这里就捡两个 被忽略惯了的字符来说,它们是"&"和"/".首先来说说"&"字符,玩过SQL注入的都知道,注入的语句可以转成16进制再赋给一个变 量运行,XSS的转码和这个还真有异曲同工之妙,原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式 来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值,下面我就 拿<img src="javascript:alert('XSS');">示例:
<img src="javascript:alert('XSS');"> //10进制转码 如图三
![]() |
<img src="javascript:alert('XSS');"> //16进制转码。
这个&#分隔符还可以继续加0变成“j” ,“j” ,“j” ,“j”等形式。
而这个"/"字符却暴露了一个严重的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>