一種自動(dòng)化檢測(cè)Flash中XSS方法的探討
0x00 前面的話(huà)
對(duì)于如何檢測(cè)Flash 中的XSS,每個(gè)人都有自己的方法,無(wú)論是使用成型的自動(dòng)化工具(比如 swfscan)還是自己開(kāi)發(fā)自動(dòng)化工具(先反編譯,再對(duì) actionscript 代碼審計(jì))還是直接人工對(duì)代碼進(jìn)行審計(jì)。都能夠檢測(cè)到 Flash 中存在的 XSS 漏洞。但是這些方法會(huì)存在一些問(wèn)題,如:
自動(dòng)化工具屬于靜態(tài)分析,誤報(bào)比較高,需要投入大量人工精力去加以分析
完全人工效果最好,但是也更加耗費(fèi)精力
在這里我們來(lái)探討一種動(dòng)態(tài)檢測(cè) Flash 中 XSS 的方法,該方法有自己的優(yōu)點(diǎn),但是也有比較明顯的缺點(diǎn),所以本文的標(biāo)題定位于“探討”。
0x01 原理
所謂動(dòng)態(tài)檢測(cè),就是通過(guò)程序加載 Flash 插件,然后再載入 Flash 文件,對(duì)事件和錯(cuò)誤信息進(jìn)行捕捉,再對(duì)信息分析來(lái)判斷 Flash 中是否存在 XSS 漏洞。
先來(lái)看下面兩張圖,以 Firefox 瀏覽器為例:
Firefox 訪問(wèn) http://test.com/xss.swf?alert=1,F(xiàn)lash 成功執(zhí)行 JS 代碼,彈出對(duì)話(huà)框。
Firefox 訪問(wèn) http://test.com/xss.swf?alert=1\",F(xiàn)lash 執(zhí)行 JS 報(bào)錯(cuò),顯示錯(cuò)誤詳細(xì)信息。Firefox 能夠顯示 Flash 執(zhí)行 JS 錯(cuò)誤時(shí)的詳細(xì)錯(cuò)誤信息。
到這里也就明白檢測(cè)的原理了,就是:
◆程序調(diào)用 Firefox
◆Firefox 加載 Flash 插件
◆Firefox 訪問(wèn)對(duì)參數(shù)經(jīng)過(guò)構(gòu)造的 Flash 鏈接,比如 http://test.com/xss.swf?alert=1\"
◆程序捕捉錯(cuò)誤信息或者 alert 事件
◆根據(jù)錯(cuò)誤信息或者 alert 事件信息來(lái)判斷該 Flash 是否存在 XSS 漏洞
0x02 具體實(shí)現(xiàn)
具體如何實(shí)現(xiàn)呢?我們不會(huì)真的調(diào)用 Firefox,而是直接采用一套開(kāi)源的可以解析 JS 的工具包:CasperJS。下面看下 CasperJS 官網(wǎng)的一段介紹:
CasperJS is an open source navigation scripting & testing utility written in Javascript for the PhantomJS WebKit headless browser and SlimerJS (Gecko).
CasperJS 目前支持兩種引擎:PhantomJS(WebKit內(nèi)核)和 SlimerJS(Gecko內(nèi)核)。Gecko內(nèi)核就是 Firefox 所使用的內(nèi)核,又通過(guò) CasperJS 文檔了解到,使用 SlimerJS 引擎時(shí)候可以通過(guò) loadPlugins 來(lái)加載 Flash 插件。
所以我們就可以通過(guò) CasperJS 來(lái)完成我們的功能需求,下面是代碼實(shí)現(xiàn):
flash_detect.js
- var casper = require('casper').create({
- pageSettings: {
- loadImages: true,
- loadPlugins: true // load flash plugin
- },
- logLevel: "info",
- verbose: false
- });
- casper.start('about:blank', function() {});
- // catch alert
- casper.on('remote.alert', function(message) {
- this.echo('{"type": "alert", "msg":"' + message + '"}');
- });
- // catch page error info
- casper.on('page.error', function(message, trace) {
- this.echo('{"type": "error", "msg":"' + message + '"}');
- });
- var url = casper.cli.get(0);
- casper.thenOpen(url, function() {
- this.wait(2000, function(){}) // delay 2's
- });
- casper.run();
代碼很簡(jiǎn)單,就是通過(guò) CasperJS 來(lái)訪問(wèn) Flash 文件,然后捕捉頁(yè)面中的錯(cuò)誤信息和 alert 事件。在這里有一點(diǎn)需要注意就是有的 Flash 不會(huì)立即執(zhí)行 JS 代碼,所以我們?cè)诖蜷_(kāi)一個(gè) Flash 文件后,在當(dāng)前的頁(yè)面停留 2 秒。
0x03 執(zhí)行效果
我們剛才那個(gè) Flash 文件用這個(gè)檢測(cè)代碼檢測(cè)下看看效果 ,如下:
- piaca at piaca in ~/source$ casperjs --engine=slimerjs flash_detect.js "http://test.com/xss.swf?alert=1"
- {"type": "alert", "msg":"1"}
- piaca at piaca in ~/source$ casperjs --engine=slimerjs flash_detect.js "http://test.com/xss.swf?alert=1\\\""
- {"type": "error", "msg":"SyntaxError: missing ) after argument list"}
0x04 寫(xiě)在后面的話(huà)
實(shí)際中我通過(guò)訪問(wèn)網(wǎng)上的一些業(yè)務(wù),把其中的 Flash 抓下來(lái),然后通過(guò)程序去檢測(cè),效果還是不錯(cuò)的。當(dāng)然這其中包括我們自己業(yè)務(wù)中的 Flash XSS 漏洞。
但是目前的檢測(cè)程序只能是一個(gè) Demo,要想在生產(chǎn)環(huán)境中使用,還需要解決以下問(wèn)題:
效率:目前是單進(jìn)程單線程進(jìn)行檢測(cè),會(huì)影響檢測(cè)效率,同時(shí)由于 SlimerJS 會(huì)打開(kāi)一個(gè) GUI 窗口,在一定程度上也會(huì)影響效率;
誤報(bào):在 Demo 中我們沒(méi)有過(guò)多的處理錯(cuò)誤信息,所以在實(shí)際測(cè)試中會(huì)有比較多的誤報(bào);
參數(shù):這里的參數(shù)只是 Flash 文件接收的參數(shù),我們通過(guò)日志分析等可以快速獲取業(yè)務(wù)中的 Flash 文件,但是如何獲取 Flash 接收的所有參數(shù)名呢?
上面幾個(gè)問(wèn)題并不是致命的問(wèn)題,我們可以通過(guò)多種方法去解決,但是正如前面所說(shuō)的這個(gè)檢測(cè)程序有個(gè)致命的缺點(diǎn),那就是:
這個(gè)檢測(cè)腳本只能檢測(cè)很明顯的 XSS 漏洞,如果 Flash 中對(duì)參數(shù)有一定的處理措可能就無(wú)法進(jìn)行檢測(cè)了;
所以本文僅僅做自動(dòng)化檢測(cè) Flash 中 XSS 漏洞的探討。































