天天看點

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

本節書摘來自異步社群《xss跨站腳本攻擊剖析與防禦》一書中的第6章6.3節flash用戶端攻擊剖析,作者邱永華,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

6.3 flash用戶端攻擊剖析

xss跨站腳本攻擊剖析與防禦

對flash的基礎概念和安全模型進行詳細介紹後,現在我們來讨論一些比較實際、也是大家最關心的問題——flash的安全漏洞。

最早研究flash漏洞的安全人員要算是stefano di-paola,當時他在owasp釋出了幾篇論文,詳細介紹了flash的衆多安全漏洞,以及如何利用這些漏洞執行xss、csrf之類的攻擊,下面讓我們一步步進行讨論。

6.3.1 geturl() & xss

在flash中被利用最多是 xss漏洞。第一個flash xss漏洞出現在2003年,利用的是clicktag 變量。

圖6-13和圖6-14所示為關于flash xss的漏洞報告。

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

clicktag變量是為基于廣告的flash設計的,其作用是跟蹤廣告,并幫助提供廣告的網絡機構跟蹤廣告的顯示位置和廣告被單擊的時間、次數等。

下面是一個典型的利用或

或者也可以這樣實作:

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

位址欄形式如下:

<a href="http://www.test.com/banner.swf?clicktag=%5bclick_through_url%5d">http://www.test.com/banner.swf?clicktag=[click_through_url]</a>

如果執行geturl(clicktag)前沒有正确檢查clicktag變量,就有可能被注入惡意腳本執行xss攻擊。

我們示範一下。打開adobe flash cs3軟體,按下快捷鍵【f9】打開動作面闆,如圖6-15所示,輸入以下actionscript代碼:

geturl (clicktag, "_top");

編譯完成之後,用浏覽器進行通路:

<a href="http://127.0.0.1/xss.swf?clicktag=javascript:alert(/xss/);">http://127.0.0.1/xss.swf?clicktag=javascript:alert(/xss/);</a>

此時成功觸發xss,如圖6-16所示。

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

上述示例中,主要利用actionscript 2.0中的geturl()函數來執行跨站腳本代碼。geturl()函數的作用是将來自特定url的文檔加載到視窗中,或将變量傳遞到位于所定義的url的另一個應用程式,文法如下:

geturl(url:string, [window:string, [method:string]]) : void

參數說明如下:

url:string:從該處擷取文檔的url

window:string [可選]:指定應将文檔加載到其中的視窗或html幀,您可輸入特定視窗的名稱,或從下面的保留目标名稱中選擇:

   _self 指定目前視窗中的目前幀

   _blank 指定一個新視窗

   _parent 指定目前幀的父級

   _top指定目前視窗中的頂級幀

method:string [可選]:用于發送變量的get或post方法,如果沒有變量則省略此參數

假設用“javascript: url”來替換:

此時,就能得到一個javascript alert對話框。這意味着,我們可以利用geturl()函數來執行任意腳本代碼。

假設一個含有漏洞的swf檔案有以下actionscript腳本:

geturl("javascript:void(0)", "_self", "get");

那麼,通過通路以下url就可以執行代碼:

<a href="http://127.0.0.1/xss.swf?a=0:0;alert(/xss/);">http://127.0.0.1/xss.swf?a=0:0;alert(/xss/);</a>

xss的效果如圖6-17所示。

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

我們來看一個更加簡單的例子。建立一個flash應用程式,輸入以下actionscript 2.0代碼:

geturl('javascript:alert(123);');

編譯好該檔案,将檔案命名為xss.swf,然後建立一個html檔案并嵌入該flash檔案:

再用浏覽器打開建立的html文檔,此時會彈出對話框,如圖6-18所示。

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

需要注意的是,雖然actionscript 2支援geturl()函數,但actionscript 3已經不支援了。和flash player的版本無關,代碼都是相容的,是以隻要用actionscript 2.0來編寫腳本即可。

總而言之,flash xss是利用有漏洞的flash檔案進行攻擊,漏洞産生的原因主要來自于未經初始化的變量。

任何未初始化的變量,如_root. 、_global. 、_level0. * 都能通過查詢關鍵字為其指派。

注入點如下。

geturl()函數 (如使用javascript:alert('xss'))。

load*(url,..) 函數 (如使用asfunction:geturl,javascript:alert('xss'))。

loadvariables(url, level )。

loadmovie ( url, target )。

loadmovienum( url, level )。

xml.load ( url )。

loadvars.load ( url )。

sound.loadsound( url , isstreaming )。

netstream.play( url )。

textfield.html屬性 (如)。

漏洞示例代碼如下:

通路以下url就能觸發xss:

6.3.2 cross site flashing

跨站flashing(cross site flashing,xsf)不是一種新型的攻擊,但是非常常見。xsf和xss原理很相似,但xsf利用編寫不規範的flash對象,并從url參數中擷取輸入,進而導緻惡意攻擊,示例如下:

<a href="http://foo.com/file.swf?url=javascript:alert(document.cookie);">http://foo.com/file.swf?url=javascript:alert(document.cookie);</a>

跨站 flash 攻擊發生時,通常來自兩個不同的域,情況如下。

當一個flash影片用loadmovie*函數(或者利用其他方法)載入另一個flash影片時,便能擷取相同的安全沙箱。

② 當html網頁使用*script去解析一個flash影片的時候,也會産生xsf。

由此可見,xsf可以通過向網站注入惡意的flash程式來實施攻擊,示例如下:

觸發漏洞的url:

<a href="http://host/movie.swf?movieuri=maliciousfile.swf">http://host/movie.swf?movieuri=maliciousfile.swf</a>

在這個示例中,flash可能包含事先定義的全局變量 _root.movieuri,并且給該變量賦予正常flash檔案進行調用,然後通過 loadmovienum()方法加載flash檔案movie.swf。但是,當攻擊者了解到此全局變量後,可以将惡意flash檔案 maliciousfile.swf 賦給該變量,浏覽器就會通過loadmovienum ()方法裝載惡意檔案。

下面再來看另外一個示例。

漏洞代碼:

loadmovie(_root.murl + '/movie2.swf');

通路位址:

<a href="http://host/foo.swf?murl=asfunction:geturl,javascript:alert(123)//">http://host/foo.swf?murl=asfunction:geturl,javascript:alert(123)//</a>

結果變成:

loadmovie('asfunction:geturl,javascript:alert(123)///movie2.swf')

進而腳本代碼被順理成章地執行。

除了上述例子中的loadmovienum()和loadmovie()函數,如果使用者能控制的某些資料沒有被嚴格處理,在下面的函數或變量中使用也可能觸發xsf攻擊。

這種含有潛在危險的函數簡稱為pdnf(potentially dangerous native function),它們通常允許使用asfunction僞協定,前面的例子即使用了asfunction來執行代碼。

<a>click here</a>

在此示例中,當【click here】按鈕被按下後,将調用myfunc()函數,而myparameter是myfunc()函數的一個參數。

6.3.3 flash參數型注入

fpi(flash parameter injection)指flash參數型注入攻擊,是一種動态注入flash的全局參數的攻擊手段。

衆所周知,網頁中的flash是直接嵌入到html文檔中的,是以不能被uri加載,但是由于flash的一些全局參數是可以通過uri來設定的。這樣一來,如果攻擊者能通路和控制flash的全局參數,就能夠進行flash xss、跨站flash等攻擊。

ibm rational的安全團體曾經釋出一本白皮書專門介紹fpi攻擊,該白皮書的名字為flash parameter injection,書中介紹了幾種可以在flash嵌入html頁面時覆寫全局參數執行攻擊的方法,有如下幾種類型:

反射型flash參數注入(reflected flash parameter injection);

附帶flashvars的反射型flash參數注入(reflected flash parameter injection with flashvars);

flashvars注入(flashvars injection);

基于dom的flash參數注入(dom-based flash parameter injection);

持久型flash參數注入(persistent flash parameter injection)。

(1)反射型flash參數注入。

當flash視訊的名稱作為url參數暴露在外的時候,攻擊者可以控制裝入的flash變量,以加載一個惡意的flash視訊。

在上面的代碼中,flash視訊的名稱取自請求中的表單或url參數,并且被放在生成的html頁面中,攻擊者可能通過下面的url覆寫一些flash全局參數:

<a href="http://www.test.com/index.cgi?movie=mymovie.swf?globalvar=e-v-i-l">http://www.test.com/index.cgi?movie=mymovie.swf?globalvar=e-v-i-l</a>

受害者單擊該連結時,即生成下面的html代碼:

(2)附帶flashvars的反射型flash參數注入。

這種方法使用flashvars屬性。該屬性可以在

漏洞代碼如下:

攻擊的方式如下:

<a href="http://www.test.com/index.cgi?language=english%26globalvar=e-v-i-l">http://www.test.com/index.cgi?language=english%26globalvar=e-v-i-l</a>

其中,26%被編碼成&amp;,并産生以下的html代碼:

(3)flashvars注入。

當任意的

width和height參數沒有被過濾和消毒,直接傳遞到輸出的html文檔,攻擊示例如下:

單擊以上連結生成下面的html代碼:

(4)基于dom的flash參數注入。

當document.location變量被用作flash參數的時候,會導緻此類攻擊,其漏洞代碼如下:

攻擊示例:

<a href="http://url/index.htm#&amp;globalvar=e-v-i-l">http://url/index.htm#&amp;globalvar=e-v-i-l</a>

生成的代碼則是:

(5)持久型flash參數注入。

該攻擊發生在flash cookie被儲存下來并且被加載到flash視訊中的情況下。

6.3.4 flash釣魚剖析

除了利用flash本身存在的漏洞執行攻擊,還可以把flash當做一個載體加以利用,如網絡釣魚攻擊。此類攻擊不要求flash或網站本身存在漏洞,而是結合社會工程學進行攻擊。

近年來,基于flash的釣魚攻擊日益增多,例如,前段時間就有利用qq空間僞裝qq安全中心進行釣魚的案例。攻擊者通過qq空間的裝扮功能,利用flash播放器播放了一個精心構造的flash檔案來仿造qq登入框,并誘使使用者輸入賬号及密碼資訊。當受害者輸入自己的qq賬号和密碼後,該資訊被發送到指定的空間,并生成一個文本檔案記錄下來。

該flash檔案的actionscript代碼如下:

服務端的處理程式如下:

虛假的flash qq登入框如圖6-19所示。

《XSS跨站腳本攻擊剖析與防禦》—第6章6.3節Flash用戶端攻擊剖析

用flash打造的登入框和真實的qq 登入框幾乎一樣,即使是頗具經驗的使用者和早期的安全解決方案都無法識别,flash釣魚攻擊的危害可見一斑。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀