一、介绍
Web2.0 是几项技术的综合应用的结果,这些技术有:AJAX(Asynchronous JavaScript and XML),Flash, JSON(JavaScript Object Notation),SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)等。这些技术加上跨域的信息访问(Cross-Site Access)。它们共同支持了Web2.0这项复杂的应用。随着Web2.0应用的逐渐广泛,有目共睹的一个变化是终端用户浏览器的功能逐渐强大。
这些变化给传统扫描工具和信息安全研究人员带来了新的挑战。这篇文章的目标是研究以下内容:
(1)新一代Web应用中扫描的复杂性和挑战;
(2)Web2.0客户端扫描对象和方法;
(3)Web2.0漏洞检测(RSS feeds中的跨站脚本攻击);
(4)使用JSON进行跨域注入;
(5)客户端浏览器过滤的防御对策;
二、Web2.0 扫描的复杂性
Web2.0应用异常复杂,这给扫描技术带来了新的挑战。它的复杂性可以归为以下几个因素:
丰富的客户端接口:AJAX和Flash利用复杂的Java Scripts和Action scripts脚本,提供了丰富的应用接口,使得从这些脚本中发现应用逻辑和关键资源变得异常困难。
信息来源:有些Web2.0应用整合了许多不同站点的信息,信息资源复杂。例如一个应用可以整合不同站点的RSS feeds或者博客资源,在一个站点建立一个大的信息库,或者利用不同来源的数据资源建立自己的Mashup。
数据结构:不同应用之间交换数据使用的数据结构多样,可以是XML,JSON,JavaScript数组等。
协议:除了简单的HTTP Get和Post,Web2.0应用可以选择其他不同的协议,例如,SOAP,REST和XML-RPC。
我们应用的目标,可以是从不同的站点获得RSS feeds,利用JSON在不同的博客站点之间交换数据,使用SOAP与证券交易所的Web Service进行通信等。所有这些服务都要使用AJAX技术,以RIA(Rich Internet Applications)的形式进行。
三、Web2.0应用的扫描技术面临的挑战
针对Web2.0应用的扫描技术面临的挑战,可以分为以下两个方面:
1.扫描服务端应用组件:当扫描Web2.0应用时,面临的最大挑战,就是获得服务器中的资源。当扫描传统的WEB应用时,可以运行一个网络爬虫,通过寻找“href”的方式,即可知道一个Web应用有哪些页面资源。但是在Web2.0的应用环境下,实现扫描,需要识别后端的网络应用,第三方的Mashup,后端的代理服务等。
2.扫描客户端组件:一个Web2.0应用,需要在浏览器中加载一些Java Scripts脚本,Flash组件和其他的一些小程序。这些组件和脚本利用XMLHTTPRequest对象同后方的WEB服务器进行通信,同时,在浏览器内部获得跨域信息也是可能的。由于Web2.0框架使用了多种客户端脚本,从不可信的第三方获得资源,这使得跨站脚本攻击(XSS)成为应用程序使用者面临的潜在威胁。AJAX,JSON技术,跨域访问和动态DOM操作技术被增加到传统的跨站脚本攻击(XSS)方法中,使得客户端组件的安全威胁大大增加。客户端组件扫描和漏洞检测是本文讨论的重点。
四、客户端扫描对象
为了能清楚的理解扫描对象,我们先举一个简单例子来说明一个WEB应用是如何部署的:如图1所示,一个Web应用运行在example.com上。客户通过浏览器访问这个应用。这个Web应用根据其使用和逻辑,分成以下几个部分:
应用资源:这些资源被example.com解释成各种形式,例如,HTML,ASP/JSP和Web Services。这些资源在信任域内,被example.com所拥有。
Feed代理:XMLHTTPRequest不能对后端服务器进行跨域访问。因此,需要建立一个代理服务器,通过代理服务器访问第三方的RSS feeds,例如,假设这个feeds是“每日新闻”,那么example.com的用户也可以获得“每日新闻”这项资讯。
博客访问:终端用户通过访问example.com可以获得因特网上的博客资源,这是因为example.com在用户的浏览器上下载了一些脚本,允许用户访问一些跨域博客。
以下是四个关键的扫描对象,来决定客户端是否存在漏洞:
1.函数库指纹:Web2.0应用是由AJAX和Flash函数库创建和支持的,这些函数库被加载到用户浏览器,以供程序运行时使用。所以,有必要提取这些函数库的指纹,和已经公布的漏洞库中的数据进行比对,例如,假设某个用户浏览器下载的某个库函数存在漏洞,并被记录在公布的漏洞库中,那么通过指纹比对可以发现这个有潜在威胁的库函数。
2.第三方不可信的信息点:在图1中,我们把Web应用划分成可信和不可信两部分。不可信的信息在加载到用户浏览器之前要进行安全扫描。图1的例子中,RSS feeds是通过应用服务器的Feed代理到达用户浏览器的,而博客信息则是直接进入用户浏览器,信息进入浏览器后都以DOM(文档对象模型)的形式存在。如果在这些信息进入用户浏览器之前,进行安全扫描,则可以避免一些安全威胁。
3.DOM访问点:由于浏览器中任何东西都以DOM的形式运行,加载的Java Scripts脚本也是来操作DOM的,所以,恶意信息在任何一个DOM访问点进入,都会对浏览器造成威胁。因此,DOM的访问点的安全扫描也至关重要。
4.利用函数和变量的漏洞检测:为了发现威胁和漏洞,需要对浏览器的运行逻辑和相应的轨迹有深入的理解,这样,一旦DOM访问点和第三方信息被识别出来,能够及时发现调用的函数,进行安全扫描。
五、扫描客户端应用(News Feeds)
这部分,我们介绍手动扫描的过程。这种方法可以进行自动化,但是考虑到应用的复杂性,枚举所有的可能组合是很困难的。如图2所示,我们的示例站点提供RSS feeds的配置。下面开始对客户端组件的扫描。
1.扫描库函数指纹
当WEB页面下载到用户浏览器后,所有的Java Scripts通过查看HTML源,都可以查找到。示例页面的Java Scripts脚本信息如图3所示。
如果使用Firefox浏览器,安装“Web Developer”插件后,还可以查看到所有脚本的源码,具体如图4所示。
通过扫描这些Java Scripts脚本可以得到以下信息:
AJAX的一个开发包文件dojo.js正在被使用。当提取指纹时,文件名成为重要的线索,通过进一步扫描内容,可以确定使用的版本。RSS feed应用所使用的函数及其所在文件也会和浏览器建立映射,本例中这些函数及其所在的文件如下:
(1)文件rss_xml_parser.js包含的函数processRSS() 和GetRSS(),用来从服务器获得RSS feeds并处理他们。
(2)文件XMLHTTPReq.jsfile包含函数makeGET()和makePOST(),用来处理AJAX请求。
(3)文件dojo.js包含其他一些函数。
把这些得到的被使用的库函数及其版本信息和已知的漏洞库中的信息进行比对,可以发现一些已经存在的漏洞。
2.第三方不可信信息访问点
我们扫描页面的HTML代码,发现以下代码片段,这段代码调用GetRSS()函数,访问不同的服务器获得不可信的RSS feeds,返回的内容可能存在恶意代码,进行有效的内容检查,可以避免一些安全威胁。
<div class="code"> <pre><select id="feeds" onChange="GetRSS();" name="feeds"> <option value="">Pick your feed</option> <option value="http://www.cnn.com/business.xml">CNN business</option> <option value="http://www.usatoday.com/business.xml">USA today</option> <option value="http://xyz.sample.org/news.xml"> XYZ business</option> </select></pre></div>
3.DOM 访问点
收集了Java Scripts脚本后,我们来寻找访问DOM的模式,这里主要关注使用到“document.*”的地方,把可能的情况简化到以下两类:
(1)document.getElementById(name).innerHTML:这个函数在HTML代码动态转换时被广泛使用。
(2)document.write():这个函数也被用来在浏览器中转换HTML代码。
在DOM访问点对转换的HTML代码进行扫描,同样可以避免一些安全威胁,下面的代码是一个Java Scripts使用“document.*”的例子。
function processRSS (divname, response) { var html = ""; var doc = response.documentElement; var items = doc.getElementsByTagName('item'); for (var i=0; i < items.length; i++) { var title = items[i].getElementsByTagName('title')[0]; var link = items[i].getElementsByTagName('link')[0]; html += "" + title.firstChild.data + ""; } var target = document.getElementById(divname); target.innerHTML = html; }
4.利用函数和变量的漏洞检测
我们可以把前面三步中获得的信息组织起来,把过滤技术使用在客户端逻辑的整个流程中。具体如图5所示。
图5所示,News Feed服务器过滤掉了“<”和“>”符号,使得注入JavaScript到DOM变得不可能。假设不设置过滤,如果一个不可信的RSS feed注入了恶意的链接,将会怎样呢?下面是一段示例代码:
<div class="code"> <pre><item> <title>Interesting news item</title> <link>javascript:alert("Simple XSS")</link> <description><![CDATA[]]></description> <author>XYZ news</author> <dc:date>2005-11-16T16:00:00-08:00</dc:date> </item></pre></div>
可以注意到link标签中含有JavaScript,因此当用户点击时,这段JavaScript脚本就会被执行。这个过程如图6所示。如果这段Java Script是恶意代码,那么用户将受到威胁。
=============================================
【参考文章】
Shreeraj Shah《Vulnerability Scanning Web 2.0 Client-Side Components Introduction》
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛https://bbs.txwb.com |
关注天下网吧微信,了解网吧网咖经营管理,安装维护:
本文来源:赛迪网 作者:佚名