- 标题:使用 Firefox攻击Web2.0应用
- 作者:Kevin
- 来自:赛迪网
- 更新:2007年9月9日
- 图1 Web2.0架构
- 图2 一个简单的新闻显示页面
- 图3 配置Firebug记录XMLHttpRequests调用
- 图4 记录Ajax调用
- 图5 使用Chickenfoot仿真onclick事件
- 图6 使用Firebug查看表单属性
- 图7 使用Firebug进行单步调试
- 图8 设置断点控制执行过程
- 图9 单步执行到validation.js脚本
- 图10 进行一个Ajax调用
- 图11 Firebug控制台显示调用的Web Service
一、引言
Ajax和交互式的Web Services正撑起Web2.0应用的大梁。技术的革新也给这项应用带来了新的安全挑战。
本文介绍了一些方法、工具和技巧,来研究Web2.0应用中面临的安全问题,介绍使用Firefox和它的插件来发现和定位安全漏洞。本文的内容主要有以下几个方面:
(1)Web2.0应用架构和它面临的安全问题;
(2)Web2.0安全评估面临的挑战,例如,发现隐藏的调用、网络爬虫问题和客户端调用逻辑的发现;
(3)使用调试工具Firebug,发现XHR(XmlHttpRequest)调用;
(4)使用工具Chickenfoot,仿真浏览器事件的自动化执行;
(5)使用调试工具Firebug,设置断点,对Web2.0应用进行单步调试;
(6)漏洞的检测方法。
二、Web2.0应用概述
Web2.0作为下一代Web应用,是诸多已有技术的综合。其中,XML驱动的 Web Services运行在SOAP、XML-RPC上,REST(Representational State Transfer)架构则给以资源为中心的Web应用带来了极大的方便。Web2.0利用Ajax技术和丰富的互联网应用组件,例如Flash,给终端用 户提供了强大的应用接口。
Web2.0的技术革新对客户端浏览器和服务器之间的Web应用和通信机制产生了重大的影响。与此同时,这项技术革新也给Web应用带来了新的安全挑战。
诸如Yamanner、Samy 和 Spaceflash等新式蠕虫能够破坏客户端Ajax框架,从而给黑客提供新的攻击途径,危及到存储在客户端主机的敏感信息的安全。
Web2.0的结构如图1所示,左侧是浏览器端的处理过程,可以分为以下几个层次:
(1)表示层:HTML/CSS提供在浏览器窗口中显示的方案;
(2)逻辑处理层:在浏览器中运行的JavaScript负责业务逻辑和通信逻辑的执行。Ajax驱动组件位于这一层;
(3)传输层:XMLHttpRequest对象提供了客户端浏览器和服务器之间的异步通信和XML数据交换机制,这里的XMLHttpRequest对象使用HTTP或者HTTPs协议。
服务器端组件在图1的右侧,位于服务器端防火墙后面,它包括了配置好的Web Services和传统的Web应用资源。一个Ajax资源运行在客户端浏览器中,可以直接与基于XML的Web Services“对话”,交换数据而不刷新整个页面。这个数据交换过程对于客户端用户来说是透明的,换句话说,用户在这期间感觉不到浏览器页面的刷新。 页面刷新和重定向是第一代Web应用的不可缺少的组成部分,但到了Web2.0时代,这些操作被Ajax的异步操作所取代。
三、Web2.0安全评估面临的挑战
在Web2.0这个异步的框架中,Web应用不再需要以前那么频繁的页面刷新和重定向,这样,一些原本能够被利用的服务器资源被隐藏了起来。以下是安全研究人员在理解Web2.0应用时面临的三个重要的挑战:
(1)发现隐藏的调用:当浏览器载入的页面的XHR调用发生时,如何能够及时准确地发现它,是很大的挑战。
(2)网络爬虫问题:传统的网络爬虫应用无法应付浏览器中页面的所有行为,当页面通过JavaScript调用XHR对象从服务器获得资源时,传统的网络爬虫无法抓取到这些资源。
(3)调用逻辑发现:Web2.0的应用通过JavaScript加载,对一个特定 的事件,很难分离出它的调用逻辑,因为每个html页面都会从服务器加载三到四个JavaScript脚本文件,每个JavaScript文件里又有很多 函数,而当一个事件发生的时候,很难去判断是哪些JavaScript文件中的哪些函数被调用。
我们需要研究出一套方法和工具,在Web应用安全评估中克服以上障碍。这篇文章的目的,正是介绍如何使用Firefox浏览器及其一些插件,来应对上述挑战。
3.1发现隐藏的调用
Web2.0的应用可能只从服务器下载一个页面,但通过几次XHR对象调用,来构建 最终的页面。这些XHR调用异步的从服务器下载资源或者JavaScript脚本。这样,我们面临的挑战就是如何判断发生的XHR调用和识别从服务器下载 的资源。这些资源可以帮助安全研究人员发现安全漏洞。让我们从一个简单的例子开始。
假设我们可以通过访问站点hxxp://example.com/news.aspx ,来了解当天的商业新闻。页面的截图如图2所示。
作为一个Web2.0的应用,Ajax调用通过XHR对象被发往服务器。我们可以通过一个工 具Firebug来识别所有的XHR对象调用。Firebug是Firefox浏览器的一个插件,在用户浏览一个页面之前,先把“Show XMLHttpRequests”选项选中,如图3所示。
启用截获XMLHttpRequest调用的选项后,我们再次浏览这个页面,这时页面向服务器发送的所有XHR对象调用都会被Firebug发现并记录下来,具体如图4所示。
我们观察图4中的“Ajax Calls”,可以看到浏览器通过XHR发送的一些请求,从服务器下载dojo Ajax框架,与此同时,向服务器发送一个调用,获取新闻文章的内容。
如果我们仔细查看代码,可以发现如下JavaScript代码:
{
var http;
http = new XMLHttpRequest();
http.open("GET", " getnews.aspx?date=09262006", true);
http.onreadystatechange = function()
{
if (http.readyState == 4) {
var response = http.responseText;
document.getElementById('result').innerHTML = response;
}
}
http.send(null);
}
上述代码发送一个异步的调用访问Web服务器,企图获取的资源是:
这个aspx页面经过编译后传给客户端浏览器。其代码放在ID为result的标签所在处。这是一个典型的使用XHR对象进行的Ajax调用的例子。
通过借助Firebug进行分析,我们可以记录一个页面所有XHR对象调用,从而发现有安全漏洞的内部URL、查询字符串和POST请求。仍然以上面的代码为例,参数date的值如果处理不当,就可能存在SQL注入漏洞。
3.2网络爬虫问题及浏览器仿真
在评估一个Web应用安全性时,一个重要的工具是网络爬虫。网络爬虫功能是爬下该 Web应用中的每个网页,搜集其中的链接。但是在Web2.0的应用中,这些链接往往都指向JavaScript函数,再由JavaScript函数通过 XHR对象调用新的页面内容,这时,网络爬虫会丢失这些信息。例如,下面是一个简单链接的集合。
<a href="/hi.html">go2</a><br>
<a href="#" onclick="getMe(); return false;">go3</a><br>
“go1”链接被点击时,getMe()函数被执行,getMe()函数的代码如下所示。这个函数可能在一个单独的JavaScript文件中实现。
{
var http;
http = new XMLHttpRequest();
http.open("GET", "hi.html", true);
http.onreadystatechange = function()
{
if (http.readyState == 4) {
var response = http.responseText;
document.getElementById('result').innerHTML = response;
}
}
http.send(null);
}
上面的代码执行后,发送一个HTTP Get请求,访问服务器上的资源hi.html。
可否使用自动化机制仿真这个点击链接的操作呢?Firefox插件Chickenfoot为我们实现了这个功能,它提供了基于JavaScript的API,扩展了浏览器的可编程接口。
使用Chickenfoot这款插件,可以自己编写简单的JavaScript代码 来使得浏览器的行为自动化。使用这种方法,像爬虫抓取网页这样简单的任务就可以自动完成了。例如下面的示例代码,可以模拟点击事件把网页上所有连接都点击 一遍。这款插件与传统的网络爬虫相比,优势显而易见:所有这些onClick事件都会产生一个XHR调用,而这些响应会被传统的网络爬虫忽略,传统的爬虫 只能试图去分析JavaScript代码,搜集可能的链接,但这并不能取代实际onClick事件的响应。
for(i=0;i<l.count;i++){
a = document.links[i];
test = a.onclick;
if(!(test== null)){
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click',true,true,document.defaultView,1,0,0,0,
0,false,false,false,false,0,null);
a.dispatchEvent(e);
}
}
读者可以把这段脚本加载到Chickenfoot控制台,然后运行。结果如图5所示。
这种方法,可以创建JavaScript脚本,在Firefox浏览器内部评估基于Ajax的Web应用的安全性。
3.3调用逻辑的发现
为了剖析客户端上基于Ajax的Web应用,我们需要仔细浏览每个事件,去判断它们的处理逻辑。一种分析处理逻辑的方式是逐行阅读源代码。通常,每个事件调用只处理几个函数。因此,需要使用一种技术,能够在浏览器中单步执行相关的代码。
目前已经开发出有几款JavaScript的调试器,可以达到以上要求,Firebug就是其中之一。在我们的例子里再次使用Firebug来进行单步执行。
让我们以登录过程为例进行说明,页面login.html从浏览器用户那里接收用户名和密码,如图6所示。使用Firebug的“Inspect”功能去确定每个表单的属性。
图6的例子中,检查表单的属性后,可以清楚的发现一个调用发生在auth()函数中。切换到“Debugger”面板,如图7所示,可以看到这个事件所对应的内部逻辑。
这个页面使用到的JavaScript脚本的依赖关系都可以从图7中清楚的看到。这个页面使 用到了ajaxlib.js和validation.js这两个脚本文件。这两个脚本文件中存在一些函数被登录页面使用到。我们可以在auth()这个函 数中设下断点,然后在用户名和密码框内输入用户名和密码,点击“Submit”,开始单步执行。
现在,我们来单步执行该程序,点击“Step in”,进入下一步,运行到如图8中高亮显示的部分,JavaScript的执行转到了另外一个位于validation.js文件中的函数userval(),如图9所示。
前面的图9所示的函数用来验证用户名的合法性。一旦验证通过,会执行下一个函数callGetMethod()。如图10所示。
最后,到达执行序列的最后,可以看到通过XHR对象调用后台的Web Services,如图11所示。
这里,我们就获得了后台服务器Web Services的资源的位置。
http://example.com/2/auth/ws/login.asmx/getSecurityToken?username=amish&password=amish
上述资源显然是运行在.net框架下的一个Web service。经过分析过可以发现,用户验证可能可以被绕过,这对Web2.0的应用来说无疑是潜在的威胁。
进一步考虑,我们可以通过使用WSDL(Web Services Description Language)文件对这个Web service进行暴力扫描。也可以进行一些注入攻击,例如SQL注入或者XPATH注入,可以使用诸如wsChess等工具,wsChess 是Net-Square公司所推出的基于.NET的Web Services安全工具包。
在这个例子中,该Web Service存在XPATH注入漏洞,对Web Service的安全评估超出了这篇文章的讨论范围。另外,这种单步执行技术,可以帮助识别一些客户端攻击,例如XSS(跨站脚本攻击),操纵DOM的攻 击,绕过客户端的安全控制,恶意Ajax代码注入等。
四、结论
SOA(面向服务体系结构)Ajax,RIA(Rich Internet Application)和Web Services是下一代Web应用的重要组成部分。为了跟上这些技术的发展,应对下一代Web应用中的安全挑战,我们需要研究不同的方法,同时开发一些 安全工具。评估这些应用安全性的一个高效的手段就是使用浏览器。
本文我们采用了几种技术去评估Web2.0应用的安全性。使用这些方法,可以发现和分离出一些与Ajax相关的安全漏洞。浏览器自动化脚本可以帮助我们在客户端资源中寻找和定位安全漏洞。
下一代Web应用中,JavaScript得到了广泛的应用。方便好用的调试工具是我们用来战胜安全漏洞的利器。这篇文章介绍了使用Firefox浏览器及其插件对Web2.0应用进行安全评估。
参考文献
[1] Ajax security,http://www.securityfocus.com/infocus/1868
[2] XHR Object specification, http://www.w3.org/TR/XMLHttpRequest/
[3] Firebug download, https://addons.mozilla.org/firefox/1843/; Firebug usage,http://www.joehewitt.com/software/firebug/docs.php
[4] Chickenfoot quick start, http://groups.csail.mit.edu/uid/chickenfoot/quickstart.html
[5] Chickenfoot API reference - http://groups.csail.mit.edu/uid/chickenfoot/api.html
[6] Venkman walkthrough, http://www.mozilla.org/projects/venkman/venkman-walkthrough.html
[7] wsChess, http://net-square.com/wschess