赵玉龙 张旋 刘梦瑶 李沁蕾
华中科技大学计算机科学与技术学院 湖北 430074
随着Internet的发展,基于Web和数据库架构的应用系统已经逐渐成为主流,广泛应用于企业内部和外部的业务系统中。各种基于 Web 应用的业务模式不断成熟,但是各种网络安全事件也随之不断发生。据国家计算机网络应急技术处理协调中心(CNCERT/CC)的统计,2007年接收的网络仿冒事件和网页恶意代码事件,分别超出2006年总数的近1.4倍和 2.6倍;赛门铁克(Symantec)公司 2008年 4月发布的Symantec Internet Security Threat Report中提到,2007年下半年有超过80%的网站都或多或少地有着XSS漏洞;而2008年5月,我国大陆地区被篡改网站的数量就有6915个。近日,微软安全应急小组确认了微软SharePoint Server 2007产品中的严重的跨站脚本漏洞(XSS)的存在。各种Web 应用的安全事件严重影响了Web 应用的发展,其中基于XSS漏洞的攻击尤为严重。
随着各种网站程序设计及网站管理设置的安全程度越来越高,各类恶意的入侵攻击者都被阻挡在网站安全防线之外,攻击者想要入侵攻击某个网站服务器,是越来越困难的事情。于是攻击者的入侵目标转向了网站的浏览者。
由于HTML语言支持脚本语言嵌入页面中的机制,从而引发了脚本的安全问题。XSS(Cross-Site Scripting)是最常见的一种应用层的攻击。XSS 攻击基本上是将攻击代码注入到各种浏览器的解释过程中,同时利用 XSS 漏洞旁路调用访问控制——例如同源策略;这种攻击可以使用各种客户端语言实现,而且这种类型的漏洞往往被用来编写危害性更大的phishing攻击和利用浏览器漏洞的攻击。
利用跨站漏洞入侵者可以进行非常多的攻击,例如盗取别人Cookie中的账号和密码,或者伪造页面,或者进行挂马,总之跨站漏洞是一个危害性很大的漏洞。
(1)反射型(又称非持久型)XSS攻击
如果一个应用程序使用动态页面向用户显示错误消息,就会造成这种常见的XSS漏洞。通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文本返回给用户。
开发人员可能没有对输入进行过滤。那么就可能产生不良后果。例如:输入一段脚本来进行测试<script>alert(“XSS”)</script>如图 1。
图1 测试界面
如果开发人员没有进行过滤,那么,页面中将会弹出一个带有“XSS”对话框如图2所示。
(2)保存型(又称持久型)XSS攻击
如果一名用户提交的数据被保存在应用程序中,(通常保存在一个后端数据库中),然后不经适当过滤或净化,就显示给其他用户,此时就会出现这种漏洞。在支持终端用户交互的应用程序中,或者在具有管理权限的员工访问同一个应用程序中的用户记录和数据的应用程序中,保存型XSS漏洞很常见。
图2 带有“XSS”对话框
一般情况下,利用保存型XSS漏洞的攻击至少需要向应用程序提出两个请求。攻击者在第一个请求中传送一些专门设计的数据,其中包含恶意代码;应用程序接受并保存这些数据。在第二个请求中,一名受害者查看某个包含攻击者的数据的页面,这时恶意代码开始执行。为此,这种漏洞有时也叫做二阶跨站点脚本。
例如在一个正常的留言板页面中,如果对用户输入的字符没有加以限制,在发表新留言中嵌入代码</script><iframe height=500 width=500 src="http://www.baidu.com"></iframe>当留言成功后,如果其他用户访问该留言板时就会发现在留言板中嵌入了一个百度搜索的框体(如图3)。
图3 保存型XSS攻击
(3)基于DOM的XSS攻击
DOM-bassed XSS是基于文件对象模型(Document Object Model)的一种漏洞,DOM 是一种与平台编程语言无关的接口,它允许程序或脚本动态地访问和更新文档的内容、结构和样式,处理后成为显示页面的一部分,DOM中的URL,location,referrer等内容都是用户可以操纵的,客户端脚本程序可以动态修改页面内容,而不是依赖于提交给服务器的数据,而从客户端获得的DOM中的数据没有严格确认,就会产生基于DOM的XSS漏洞。
例如 HTTP请求一个页面 HTTP://www.xxx.com/print.html?user=ABC实际上是使用了一个脚本输出用户名,但是如果把user=ABC改为<script>alert(“hello”)</script>就会导致XSS攻击。当用户访问这个页面就会弹出一个窗口。
如果脚本处写的是恶意代码,并且将这个 URL发给其他用户,就会导致其他用户在不知情的情况下执行了恶意的代码。
(1)挂马
利用保存型XSS漏洞可以进行挂马,保存型跨站脚本攻击可以利用页面的输入框体对信息过滤不严格嵌入 JavaScript脚本,导致其他用户访问该页面时运行脚本。这个漏洞便可以利用进行挂马。
从上面嵌入网页框架可以看出,如果访问一个网站,该网站被嵌入了其他网站的框架,另一个网站也会被访问。因此我们可以构建一个长度和宽度均为0的网页框架,在网页框架中会打开填写的网页地址,代码如下:</script><iframe height=0 width=0 src="http://www.木马.com"></iframe>而且该网页在页面中是完全隐蔽的,从外观上看不出与正常页面任何的不同。但是,访问正常页面的用户不知不觉中却访问了另一个包含有木马的网站,浏览器可能会下载一份木马到本地计算机上。
或者也有可能嵌入的 JavaScript脚本本身就是一段恶意的代码,可以在访问者的本地执行一些非法的操作。
(2)cookie盗取
假设有一个论坛,该论坛用cookie来存储用户的登录信息。而此论坛的用户信息页面存在一个XSS漏洞,比如说个人简介栏中。Bob是一个攻击者,他发现了该论坛的这个漏洞,而且Bob拥有一个www.attacker.com的域,那么Bob就具备了攻击的条件。
首先,Bob注册成为这个论坛的用户,尽可能多的在自己的 ID中增加有吸引力的元素,然后在自己的个人简介等处添加代码,并且Bob在自己的域中架设一个服务器,这时普通用户Alice在查看Bob的个人简介的时候也会向B的服务器中提交自己访问论坛等地方的COOKIE,这时Bob可以利用获得的COOKIE冒充Alice用户登录论坛,如果Alice用户是一个管理员的话,此时Bob将获得论坛的管理员权限。
或者如果论坛中存在基于DOM型的XSS漏洞时,Bob只需要发送给Alice类似于http://www.luntan.com/login.php?message= <script>var+i=new+Image;+i.src=” http://www.attacker.com/”+document.cookie;</script>这样的链接时,Alice可能就会因为点击了这样的链接登录论坛而导致COOKIE被窃取。
跨站脚本攻击具有相当大的危害性,而且跨站脚本攻击相对于其他网络漏洞攻击而说,它具有更加隐蔽的特点。因此它的防范也更加困难。XSS攻击产生在用户和Web程序交互的过程中,因此防范跨站脚本攻击需要我们在编码上和用户安全意识上两方面入手采取相应的防范手段。
(1)编码过程中对非法字符串进行处理
① 确认输入串的规则和长度
如果网站需要保存或者对用户提交的数据进行反应时,网站应用程序应当对用户提交的数据进行尽可能严格的确认,应当保证:
数据的长度不要太长;
数据尽包含合法的字符串;
数据应当与相应的正规表达式相匹配,例如对电子邮件地址和姓名应当使用不同的确认规则。
② 将字符串进行编码输出
网站也应当对用户提交的数据进行HTML编码,以过滤可能产生的恶意字符。这样可以保证浏览器在浏览到恶意代码时可以安全的处理,把恶意的字符当做是HTML文档的内容而非是结构。例如将字符HTML编码如下:
" "
' '
& &
< <
> >
③ 过滤特殊的输入字符
由于产生恶意脚本大部分是由于执行了"<>"等恶意的标签或者字符内容,因此我们应当将用户输入的可能在HTML里产生脚本的恶意字符进行过滤掉,禁止用户提交该类代码这类字符主要包括“< > " ' % ; ( ) & + -”等。
④ 对可能造成跨站攻击的地方进行审查
在网站的页面上有一些位置是用来给用户提交输入的地方,在对这些地方编写代码的时候应当进行特别的审查和测试防止有方式可以注入恶意的字符串,在审查的时候可以利用一些开源的审查软件如:RatProxy等对网站的安全性进行测评。
(2)作为网络用户的防范措施
只访问可信任的站点,而且在访问信任站点的时候最好是通过地址栏直接输入地址进行访问而不是通过其他站点的链接;
不要轻易访问其他人给你的链接,特别是跟了很长一段字符串的链接,因为这段字符可能是恶意的脚本进行编码后的结果;
禁止浏览器直接不经过任何限制的运行 JavaScript或者ActiveX.;
定时对防病毒软件和防火墙进行升级。
跨站脚本攻击不同于普通的针对网站或者针对服务器的攻击,此类攻击往往不易引起网站应用程序开发者的注意和重视,然而正是如此,跨站脚本攻击才会对网站的正常访问者造成非常大的安全威胁。为了防范跨站脚本漏洞和攻击不仅仅需要网站开发和建设者的努力,更需要浏览器的制作商的支持,以及网络用户的安全意识的提高,因此,针对跨站脚本攻击已经成为了网络安全领域的热点话题。
[1] Daffdd Stuttard,Marcus Pinto著,石华耀等译.黑客攻防技术宝典(web实战篇).人民邮电出版社.2009.
[2] 逍遥.网站入侵与脚本攻防修炼.电子工业出版社.2008.
[3] 古开元,周安民.跨站脚本攻击原理与防范.网络安全技术与应用.2006.
[4] 黄文锋.DOM-based XSS攻击原理与防范.华南金融电脑.2009.