首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议149:警惕基于DOM的跨域侵入

关灯直达底部

随着Web 2.0的发展及Ajax框架的普及,富客户端Web应用(Rich Internet Application,RIA)日益增多,越来越多的逻辑已经开始从服务器端转移至客户端,这些逻辑通常都是使用JavaScript语言编写的。但遗憾的是,目前开发人员普遍不太关注JavaScript代码的安全性。据IBM X-Force 2011年中期趋势报告揭示,在世界500强的网站及常见知名网站中有40%存在JavaScript安全漏洞。

客户端JavaScript安全漏洞与服务器端安全漏洞原理略为不同,自动化检测JavsScript安全漏洞目前存在较大的技术难题,不过利用IBM Rational AppScan Standard Edition V8.0新特性(JavaScript Security Analyzer,JSA)技术来自动检测JavaScript安全漏洞还是一个不错的选择。

2010年12月,IBM公司发布了关于Web应用中客户端JavaScript安全漏洞的白皮书,其中介绍了IBM安全研究机构曾做过的JavaScript安全状况调查。调查中,样本数据包括675家网站,其中有财富500强公司的网站以及另外175家著名网站,包括IT公司、Web应用安全服务公司、社交网站等。为了不影响这些网站的正常运行,研究人员使用了非侵入式爬虫,仅扫描了无须登录即可访问的部分页面,每个站点被扫描的页面不超过200个,这些页面都被保存下来。研究人员采用IBM公司的JavaScript安全分析技术离线分析了这些页面,集中分析了基于DOM的跨域脚本编制及重定向两种漏洞。

测试结果令人吃惊,这些知名网站中有14%存在严峻的JavaScript安全问题,黑客可以利用这些漏洞植入流氓软件、植入钓鱼站点,以及劫持用户会话等。更令人吃惊的是,随着IBM公司的JavaScript安全分析技术的不断发展,IBM公司重新测试了上述这些知名网站,2011年中期的X-Force报告显示发现了更多的安全漏洞,大约有40%的网站存在JavaScript安全漏洞。

1.基于DOM的跨域脚本编制

XSS(Cross Site Script,跨域脚本编制,也称为跨站脚本攻击)就是表示攻击者向合法的Web页面中插入恶意脚本代码(通常是HTML代码和JavaScript代码),然后提交请求给服务器,随即向服务器响应页面植入攻击者的恶意脚本代码,攻击者可以利用这些恶意脚本代码进行会话劫持等攻击。

跨域脚本编制通常分为反射型和持久型,下面进行简单说明。

❑反射型:请求数据在服务器响应页面中呈现为未编码和未过滤。

❑持久型:包含恶意代码的请求数据被保存在Web应用的服务器上,每次用户访问某个页面时恶意代码都会被自动执行。这种攻击对于Web 2.0类型的社交网站来说尤为常见,威胁也更大。

应对跨域脚本编制的主要方法有两个:

❑不要信任用户的任何输入,尽量采用白名单技术来验证输入参数。

❑输出的时候对用户提供的内容进行转义处理。

鲜为人知的是,还有第三种跨域脚本编制漏洞。2005年,Amit Klein发表了白皮书“基于DOM的跨域脚本编制——第三类跨域脚本编制形式”(DOM Based Cross Site Scripting or XSS of the Third Kind),其中揭示了基于DOM的跨域脚本编制不需要依赖服务器端响应的内容。如果某些HTML页面使用了document.location、document.URL或者document.referer等DOM元素的属性,那么攻击者可以利用这些属性植入恶意脚本实施基于DOM的跨域脚本编制攻击。

存在DOM based XSS的HTML代码如下:


<HTML>

<TITLE>Welcome!</TITLE>

Hi

<SCRIPT>

var pos=document.URL.indexOf(/"name=/")+5;

document.write(document.URL.substring(pos,document.URL.length));

</SCRIPT>

<BR>

Welcome to our system

</HTML>


按照该页面JavaScript代码的逻辑,上面代码接受URL中传入的name参数并展示欢迎信息。正常情况下的访问URL如下:


http://www.mysite/welcome.html?name=Jeremy


如果恶意攻击者输入类似如下的脚本,那么该页面会执行被注入的JavaScript脚本。


http://www.mysite/welcome.html?name=<script>alert(document.cookie)</script>


很明显,当受害者的浏览器访问以上URL时,服务器端会像在正常情况下一样返回HTML页面,然后浏览器会继续将这个HTML解析成DOM,DOM中包含document对象的URL属性将包含<script>alert(document.cookie)</script>注入的脚本内容,当浏览器解析到JavaScript时会执行这段被注入的脚本,导致跨站点脚本编制攻击成功实施。

值得关注的是,通过以上示例可以看出,恶意代码不必要嵌入服务器的响应中,基于DOM的跨站点脚本编制攻击也能成功实施。

可能部分读者会认为:目前主流浏览器会自动转义URL中的“<”和“>”符号,转义后的注入脚本就不会被执行了,基于DOM的跨站点脚本编制也就不再有什么威胁了。这句话前一半是对的,后一半就不准确了,因为攻击者可以很轻松地绕过浏览器对URL的转义。例如,攻击者可以利用锚点“#”来欺骗浏览器,浏览器会认为“#”后面的都是片段信息,将不做任何处理。


http://www.mysite/welcome.html#?name=<script>alert(document.cookie)</script>


2.通过URL重定向钓鱼

网络钓鱼是一个通称,它表示通过欺骗的手段窃取用户私人信息。通过URL重定向钓鱼指的是Web页面采用HTTP参数来保存URL值,并且Web页面的脚本会将请求重定向到该保存的URL上,攻击者可以将HTTP参数中的URL值改为指向恶意站点,从而顺利启用网络钓鱼来欺骗当前用户并窃取用户凭证。

下面代码给出了较为常见的含有通过URL重定向钓鱼漏洞的行为方式。


<SCRIPT>

var sData=document.location.search.substring(1);

var sPos=sData.indexOf(/"url=/")+4;

var ePos=sData.indexOf(/"&/",sPos);

var newURL;

if(ePos<0){

newURL=sData.substring(sPos);

}else{

newURL=sData.substring(sPos,ePos);

}

window.location.href=newURL;

</SCRIPT>


可以看出,这些JavaScript脚本负责执行重定向,新地址是从document.location、document.URL或document.referer等DOM元素的属性值中截取出来的。例如,类似下面的执行重定向的URL:


http://www.vulnerable.site/redirect.html?url=http://www.phishing.site


显然,一旦执行了上面的URL,将重定向到钓鱼网站。这个漏洞的原理很简单,比服务器端的重定向漏洞更好理解。但在通过URL重定向钓鱼的情况下,钓鱼站点的网址并不会被服务端拦截和过滤,因此,这个漏洞往往比服务器端重定向漏洞更具有隐蔽性。

3.客户端JavaScript Cookie引用

Cookie通常由Web服务器创建并存储在客户端浏览器中,用来在客户端保存用户的身份标识、Session信息,甚至授权信息等。客户端JavaScript代码可以操作Cookie数据。如果在客户端使用JavaScript创建或修改站点的cookie,那么攻击者就可以查看到这些代码。通过阅读代码了解其逻辑,甚至可以根据自己所了解的知识来修改cookie。一旦cookie包含了很重要的信息,如包含了权限信息等,攻击者很容易利用这些漏洞进行特权升级等攻击。

4.JavaScript劫持

利用JSON作为Ajax的数据传输机制的Web应用程序通常都容易受到JavaScript劫持攻击,传统的Web应用程序反而不易受攻击。

JSON实际上就是一段JavaScript,通常是数组格式。攻击者在其恶意站点的页面中通过<SCRIPT>标签调用被攻击站点的一个JSON动态数据接口,并通过JavaScript Function Hook等技术取得这些JSON数据。如果用户在登录被攻击网站后(假定其身份认证信息是基于Session Cookie来保存的)又被攻击者诱引访问了恶意站点页面,那么,恶意站点会发送JSON数据获取请求至被攻击站点,被攻击站点服务器会认为当前请求是合法的,并向恶意站点返回当前用户的相关JSON数据,从而导致用户数据泄密,这是因为<SCRIPTsrc=/">这种标签的请求会带上Cookie信息。整个过程相当于一个站外类型的跨站点请求伪造(CSRF)攻击。

随着Ajax的进一步推广,以及HTML 5的逐步应用,还会有更多的客户端安全漏洞出现。目前对于JavaScript的安全研究尚不多,新推出的HTML 5客户端存储、跨域通信等新特型也都跟安全紧密相关,有兴趣的读者可以进一步研究。