Web2.0用戶端元件弱點掃描(一)
一、介紹
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應用根據其使用和邏輯,分成以下幾個部分:

圖1 Web 2.0 應用部署
應用資源:這些資源被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的配置。下面開始對客戶端元件的掃描。

圖2. RSS feed配置
1.掃描函數庫特徵
當WEB頁面下載到用戶瀏覽器後,所有的Java Scripts透過查看HTML源,都可以搜尋到。示例頁面的Java Scripts腳本資訊如圖3所示。

圖3. 應用頁面的JavaScript
如果使用Firefox瀏覽器,安裝”Web Developer” Plugin後,還可以查看到所有腳本的原始碼,具體如圖4所示。

圖 4. 所有JavaScripts腳本原始碼
透過掃描這些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所示。
http://www.securityfocus.com/images/infocus/shah-web2client-5.jpg 圖 5.News feed函數的執行邏輯和資料流
圖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是惡意程式碼,那麼用戶將受到威脅。(責任編輯:李磊)

圖 6. 使用鏈結進行跨網站腳本攻擊
待續 ....
(為更適合繁體讀者閱讀,本文經資安之眼編輯與潤稿)





