我爱电脑技术论坛's Archiver

LOK 发表于 2008-6-7 22:35

字符集导致的浏览器跨站脚本攻击

|=———————————————————————————————–=|
OEsqn4l |=—————–=[ 字符集导致的浏览器跨站脚本攻击 ]=—————–   –=|
t-?9s1o']1Kzc6Q 前言:这种利用类型的攻击早在06年就被安全研究人员指出,不过一直没有在国内重视。而由于我们国内大部分站点正是这种有漏洞的字符集,所以影响还是比较大,希望各大站快速修复。可以看看[url]http://applesoup.googlepages.com/[/url]。
bN.~9Kx
6^@Sb!f!PVJ3R 文中<已经被替换为〈,如果需要文档,请访问[url]http://www.80sec.com/release/charset-xss.txt[/url]cC*m*VK&F(hXS[
K MM QN}-~$i5e0?y
在一般的web程序里,显示数据给浏览器的时候都会指定一个字符集,在国内平时我们用到的字符集有utf-8,GBK,gb2312等等,字符集指示了浏 览器该如何对待返回的数据。其中gb2312和GBK字符集使用得非常广泛,但是经证明,IE在处理这些宽字符集的时候存在问题,导致可能程序的一些安全 规则被Bypass掉,引发严重的跨站脚本安全漏洞。在IE里,如果它遇到一个字符,它是指定字符集里的第一位的时候,就会认为其后续字符和当前字符构成 一个合法的字符,这样它在解析包括html标签,处理javascript,Css时都会做如此考虑,测试版本为ie6和ie7。
v o&ds&f+adL j :M2n[ cT.C
1 Bypass某些js的检查规则
:Y-a k-~J
[^x7{p)Z4K 〈HTML>5`/x6go!g`
〈HEAD>
:D{2a8r9m:VbI:V 〈TITLE>80sec test〈/TITLE>
PU+_:UO9ou*I 〈meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
Z)} v,LD 〈/HEAD>
]c+v.Z2jV2t%nQ 〈BODY>3~C@ \O n+R
〈script>
7fRW-i GQ window.onerror=function(){
7Hj:t["|6p:GZ } alert('Vul');G}E8~/}GLp
return true;3x'r'[B2eLl"g
}$d(}(YA2\s
〈/script>
i|{ D4AW"h e` 〈script>x='〈?php echo chr(0xC1);?>';y='[User_IN_PUT]‘;〈/script>
5b hL~+z*yc&M&u 〈/BODY>h V:A[+H5]
〈/HTML>}r6`AF2P K

GKE i ~.]N vH4Z 这里即使是过滤了〈>’\等字符一样可以利用非法字符集序列来实现\的作用,因为它会把原来存在的’给结合掉,然后前面的’找不到闭合,后面[User_IN_PUT]就可以用来执行js代码了。0d-LZY&r

}(xPI7kd ad 2 Bypass某些属性的检查规则s6PTp@(k
oq2V-M;`zQ+|
为了避免直接使用html导致出现漏洞,一些论坛和程序使用了UBB标签,但是在gbk等多字节编码下,一样容易出现问题,以最容易出现问题的一个UBB标签为例子:
W$vE eB*Y.bN Y&K hE5r/g~e2?
[color=xyz〈?php echo chr(0xC1);?>][/color][color=abc onmouseover=alert(/xss/) s=〈?php echo chr(0xC1);?>]exploited[/color]'J8j C!O&{C

B%ETIqR6K(|!S 0xC1是一个gb2312的第一个字节,上面结果将会转化为:Es$I^a*l?L*b0~

fV/g_&q6k1O@)IC 〈font color="xyz?>〈/font>〈font color="abc onmouseover=alert(/xss/) s=?>exploited〈/font>
ToG$Fs:DB[J
yM"Kp"R8i.a*[D"E 其中的alert(/xss/)将会做一个事件执行,所以即使UBB标签也变得不安全,能饶过”的保护。许多论坛都没有注意这点,phpwind,动网等 论坛就容易受到这种攻击。而Discuz通过在转换结果之后附加一个空格,修补了这一安全问题。这里使用到ubb标签其实有一个很有意思的tips在里 面,因为有的数据库会抛弃与指定字符集不匹配的字符,所以必须借助后面的]等字符来形成一个有效的汉字才能存储到数据库里,当然像ACCESS这种就不会 有问题了,另外一些语言在处理字符串的时候会强制字符串的字符集类型,不合法的字符会导致转码的失败或者遭到抛弃,所以也不能利用这种类型的攻击。
:[.V1r Y6Sz,I 9l G"NNO$D1vTI-YM
3 几个小例子
?Q ~4Dpf*] L 9|2v&du(K
Phpwind论坛charset跨站脚本漏洞/k2Y^!t"F%A8Ox
'\*JF jk*m6G1vj
[email=xxxx羃[/email][email=xxxx onmouseover=alert() s=羃]Fuck Me[/email]
F0f4e)xB [font=宋体;0xc1]xxx[/font][url=http://onmouseover=alert()//]xx[/url]
]&grw5\ yF*b
0u~1~V[ y,XA!c 羃是一个特殊的十六进制编码和后面的]结合出来的字符,第一个种方法可以直接复制的:)
t EDb MJTo%] {3i){ 0xc1表示一个十六进制的字符编码
)r6C,p:Zc(` {1x}T@1Y+J9U
同样在dvbbs论坛也很容易产生一个xss代码如下PR6\szUv&v
/[n!wE&l0Y4`(q/b z
〈font face="微软雅羃>xxxxxxxxxxx〈/font>〈font face=" onmouseover=alert() x=羃>xxxxxxxxxxx〈/font>
6c t z @"z%Ay
7^#w^LR 均在新版和老版测试通过。|Ri8U9p0|}6H.?S
$E!Q~(v,Rxy
4 关于修复^E%GdU
'I0r(Cjo^
对于程序设计者,由于UTF-8字符集的可靠性,不存在这个安全漏洞,所以大家在设计站点的时候可以考虑使用UTF-8字符集。$xb9Be3s!Z
对于广大开发者,可以牢记最小输入等于最大安全的原则,在匹配正则的时候限制输入的字符的范围,尽量匹配ascii字符,如果必须使用中文,可以考虑类似于discuz的在中文后面添加空格修复该问题。] EC#RP\v D
对于广大用户,这个漏洞由于浏览器处理页面字符的不同,可以考虑使用如Firefox浏览器,可以避免一部分这样的问题。

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.