我爱电脑技术论坛's Archiver

小迷糊 发表于 2008-6-25 08:19

小心字符集导致浏览器软件跨站脚本攻击

在一般的web程序里,显示数据给浏览器的时候都会指定一个字符集,在国内平时我们用到的字符集有utf-8,GBK,gb2312等等,字符集指示了浏览器该如何对待返回的数据。其中gb2312和GBK字符集使用得非常广泛,但是经证明,IE在处理这些宽字符集的时候存在问题,导致可能程序的一些安全规则被Bypass掉,引发严重的跨站脚本安全漏洞。在IE里,如果它遇到一个字符,它是指定字符集里的第一位的时候,就会认为其后续字符和当前字符构成一个合法的字符,这样它在解析包括html标签,处理javascript,Css时都会做如此考虑,测试版本为ie6和ie7。 T3r l,DX P

T+rH#v1[,|Bnu*fo 1 Bypass某些js的检查规则 M%F'N3{~"K
qAFo }a t-|/S
2U'e0l d#q-o1P
HTML]"}7H2c+Dk8as-aA
[HEAD]l(^.~-Zt2Q| S1f
[TITLE]80sec test[/TITLE]p.T-N"kH,[Cj
[meta http-equiv="Content-Type" content="text/html; charset=gb2312" /]'gTKD d-}+c
[/HEAD]
;}V-V%BUE]1g [BODY]
gt#e2f G-P4i$e!r [script]o-{4[? iz
window.onerror=function(){U5?J%p!Zr
alert('Vul');
*lISHe S] return true;xJ%Ic0@ H+p
}
7fQQ&h"wh B#XQ [/script]*N/@ A3HJJ t'f
[script]x='[?php echo chr(0xC1);?]';y='[User_IN_PUT]‘;[/script] _O"uDL.i
[/BODY]
\ o7Qi-]S xL [/HTML]
~Ys sUc Z%@ K} f!mB,W!yDz0RH,J
L h7lZ%r

.l`$t1V F!])y
];\ t*}{ 这里即使是过滤了〈>’\等字符一样可以利用非法字符集序列来实现\的作用,因为它会把原来存在的’给结合掉,然后前面的’找不到闭合,后面[User_IN_PUT]就可以用来执行js代码了。 p*SP_s

{K+Oz+G*I ]'e 2 Bypass某些属性的检查规则
A u%j7o w/^t
/V0N[@3U9? 为了避免直接使用html导致出现漏洞,一些论坛和程序使用了UBB标签,但是在gbk等多字节编码下,一样容易出现问题,以最容易出现问题的一个UBB标签为例子:
#C ]c~.c@\{
|8a5`$v$bD4^|1q :M p4`(C kj
color=xyz[?php echo chr(0xC1);?]][/color][color=abc onmouseover=alert
ixT7\p_do (/xss/) s=[?php echo chr(0xC1);?]]exploited[/color];R#vsK)H-g
`PvH9O-@z
*U~.rp \R'H{"r

^;yrr"n/D;d
!x.X \R`Vz 0xC1是一个gb2312的第一个字节,上面结果将会转化为:
z4Ah[t|i$\I+v
VfNy M E0s9d2o4TV)^[
font color="xyz?][/font][font color="abc onmouseover=alert(/xss/) s=?]S:|QSB/p(U
exploited[/font]
+Ux6I-TM? 其中的
TEJ[*Sd}B alert(/xss/)
4RJ h,J4RO9b (A5\s L9^z4m3C

(R$s:yyoGD{(EU
H"cw}G0p B G j6R/R{ s4U4bG9OD
将会做一个事件执行,所以即使UBB标签也变得不安全,能饶过”的保护。许多论坛都没有注意这点,phpwind,动网等论坛就容易受到这种攻击。而Discuz通过在转换结果之后附加一个空格,修补了这一安全问题。这里使用到ubb标签其实有一个很有意思的tips在里面,因为有的数据库会抛弃与指定字符集不匹配的字符,所以必须借助后面的]等字符来形成一个有效的汉字才能存储到数据库里,当然像ACCESS这种就不会有问题了,另外一些语言在处理字符串的时候会强制字符串的字符集类型,不合法的字符会导致转码的失败或者遭到抛弃,所以也不能利用这种类型的攻击。
7W}9Y?6lS!XNUa
-hQ~4hZi 3 几个小例子 &H_4T2HX`
+[ vN~,e l
Phpwind论坛charset跨站脚本漏洞
.|epc7Nx #vA ?~8{'W,S b6v

u2w%Hd{4X [email=xxxx羃[/email][email=xxxx onmouseover=alert() s=羃]Fuck Me[/email]
-LM`!R%w [font=宋体;0xc1]xxx[/font]xx
Gb6K~5{t$]
j dY:]4ft l8L jU
rV4C9h_9i9HS4C
6@z+n.P"X A 2Vk*Y T$B(xe
羃是一个特殊的十六进制编码和后面的]结合出来的字符,第一个种方法可以直接复制的:) d6q$sz0m E1E

a ~ |X)C 0xc1表示一个十六进制的字符编码 .[4I'^0Rzp Z8W5D
\6UJ#I'rn y'V
同样在dvbbs论坛也很容易产生一个xss代码如下 J6cw!W1P2pz+}

._2LR*i-G\5^}
z']ndn]$K[ xxxxxxxxxxx[/font]+JKbaeye
^3^fIYa`+H6G

NJn Wg2R p aQ.p2m.~9S*?B7Va
:OEZ"H|Xxz
均在新版和老版测试通过。 f t9@s`

uX#C7k eO 4 关于修复
OQV4R*i5|
]4e.T\4OLA Iq 对于程序设计者,由于UTF-8字符集的可靠性,不存在这个安全漏洞,所以大家在设计站点的时候可以考虑使用UTF-8字符集。 1lQhE@

;d%\~|'P)p1M#U 对于广大开发者,可以牢记最小输入等于最大安全的原则,在匹配正则的时候限制输入的字符的范围,尽量匹配ascii字符,如果必须使用中文,可以考虑类似于discuz的在中文后面添加空格修复该问题。 F aQ~0z8d
-l!U n \5U p
对于广大用户,这个漏洞由于浏览器处理页面字符的不同,可以考虑使用如Firefox浏览器,可以避免一部分这样的问题。

页: [1]
   

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