1 引言
7 E+ M6 b( o6 U3 x, u0 S1 c; Q o( W# x0 H. G
8 I1 c5 `% h) K/ X8 C
在Web 2.0出现以前,跨站脚本(XSS)攻击不是那么引人注目,但是在Web 2.0出现以后,配合流行的AJAX技术,XSS的危害性达到了十分严重的地步。比如,世界上第一个跨站脚本蠕虫发生在MySpace网站,20小时内就传染了一百万个用户,最后导致该网站瘫痪。因此我认为,XSS是在脚本环境下的溢出漏洞,其危害性绝不亚于传统的缓冲区溢出漏洞。
( X0 D K4 {6 x0 z- f2 Q 6 h7 `! }" ]- m {+ N. x
2 XSS攻击的定义
9 y5 x3 [4 d! e + C# f! k: V7 I; N, _: e8 t7 }" W
跨站脚本英文名称是(Cross Site Script),为了与层叠样式表(Cascading Style Sheets)区分,故命名为XSS。 ' f' v- }* p, ?* ^ ?
XSS攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面时,嵌入其中的脚本将被解释执行。
% p3 P* V/ k @0 \9 G
9 U! P! Z- l! K# q 3 跨站脚本漏洞的成因
) h ]5 Q2 V. }7 O9 D: i/ Y ( {' x% p1 h. ^) T# l' Q$ s
3.1XSS成因概括 }5 j& ~# I+ P3 V) K& f/ U& k
XSS其实就是Html的注入问题,攻击者的输入没有经过严格的控制进入了数据库最 $ S5 s1 Q: N5 l: r
终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行Html代码,数据流程如下:攻击者的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。 / ^0 o9 H2 `) |+ e( D
3.2常规跨站漏洞 2 x; n0 K! A7 p5 @, M! p& O
我们来看一段接收评论的代码: 7 C3 R h% s' }+ D0 h S, Y% o' a
<%
+ W" M7 T! Q& R3 @9 l UserName= Request.Form(” UserName”) 0 T0 d3 i9 k: @7 g# t; a
Comment=Request.Form(”Commmet”)
! ]( P' M. A1 l, Y5 T$ ?! {7 w Email= Request.Form(”Email”)
0 t, J2 A9 T( {) b Conn.execute(“insert into Comment (Com_UserName, Com_Comment, Com_Email) values(’”& UserName&”’,’”& Comment&”’,’”& Email”’)”)
9 w: X" L8 J) `, F %>
3 r( t0 W+ {* U 可以看到,从客户端输入的所有变量没有经过任何过滤就直接进入了数据库。攻击者可以在表单中输入:,点击提交后,那么其他用户在浏览该页面时就会不知不觉打开一个预先挂有木马的页面http://www.xxx.com/muma.html,如果没打相应的补丁,就会中马。当然XSS的攻击方式还有很多,比如通过跨站将上传的图片备份直接得到WebShell、结合AJAX技术通过蠕虫攻击等,因为这不是本文的重点,在这里就不一一列举了。 - e" P% K+ s& z. Q
3.3 UBB跨站漏洞 $ F+ F7 m, n5 ~0 t+ @0 ~, l! E
在很多论坛里发帖时,点击图片模样的按钮,在编辑区域就会出现[IMG][/IMG]的字样,这是采用了一种UBB编码的方式,如果攻击者输入,它会默认将其转换为,通过这种方式诱发的跨站漏洞称为UBB跨站漏洞。
0 }5 X7 T3 `3 ]3 j ; ~6 P% {9 n* X2 V) _0 }# u
4 防范方法
3 D0 c7 l4 }1 \4 C 1 E7 ~3 `. P! S- s/ a
4.1针对常规跨站漏洞 & u2 u# v) J, C' M( D0 Y% x2 J
在常规的跨站漏洞中,正是因为攻击者可以不受限制地引入“<>”,导致了他可以操纵一个html标记,从而诱发了XSS攻击。因此首先就要过滤掉“<>”: + a9 [+ Y1 ?" X) U
Replace(str,”<”,”<”) 7 U2 z/ A0 O( ^/ g) q* M" T
Replace(str,”>”,”>”) ( _' ~" w- D1 ~
4.2针对UBB跨站漏洞 ' A1 p4 B# S* F# ?* {- x3 f) q
UBB跨站漏洞的防范相对来说比较复杂,首先攻击者必须引入javascript或vbscript代码来达到攻击的目的,所以首先要过滤中javascript后面的冒号,将其用中文的冒号替代: : \/ s/ D; D! q9 h' M
Replace(str,”:”,”:”)
. V. u# \3 n# X+ k7 v8 s8 }' o 但是HTML支持&#ASCII这样的编码,攻击者又可以通过重新达到目的(58是冒号的十进制ASCII码),所以必须过滤&符号:
# p! F% {+ w# p, I$ f( Z Replace(str,”&”,”&”)
( p5 o2 n1 c& v% `$ h1 d/ l 以上虽然已经过滤了来自标签属性的威胁,攻击者还是可以通过触发一个错误事件来达到目的。所以还需过滤掉以下字符:
( U' U( ~2 R, j0 J Replace(str,” ”,” ”)//过滤空格
+ O8 I K2 U: q& u2 o# n9 { Replace(str,”=”,”=”)//过滤等号 9 @# W6 [% K5 K/ P* S. ~% L
Replace(str,””””,”"”)//过滤双引号
3 G) w; I) S+ d4 ~( t9 y
6 Z4 O# S- R+ ^4 U: d5 z0 h% t9 h 5 结束语
( I5 C/ |* }' }# \. R1 Q6 v
8 B& N* |1 {$ n$ z. q8 k8 g7 Z4 d 通过以上分析我们看到,XSS是一种危害较大、较难防范,并且更加隐蔽的攻击方式。其实只要明白其原理,再加上勤加思考防范的对策,就可以根治XSS漏洞。
* @6 n8 ^& p/ s I; F/ `0 j |