一種自動化檢測 Flash 中 XSS 方法的探討

wyzsk發表於2020-08-19
作者: 新浪安全中心 · 2014/05/16 17:09

作者:piaca

0x00 前面的話


對於如何檢測 Flash 中的 XSS,每個人都有自己的方法,無論是使用成型的自動化工具(比如 swfscan)還是自己開發自動化工具(先反編譯,再對 actionscript 程式碼審計)還是直接人工對程式碼進行審計。都能夠檢測到 Flash 中存在的 XSS 漏洞。但是這些方法會存在一些問題,如:

  • 自動化工具屬於靜態分析,誤報比較高,需要投入大量人工精力去加以分析
  • 完全人工效果最好,但是也更加耗費精力

在這裡我們來探討一種動態檢測 Flash 中 XSS 的方法,該方法有自己的優點,但是也有比較明顯的缺點,所以本文的標題定位於“探討”。

0x01 原理


所謂動態檢測,就是透過程式載入 Flash 外掛,然後再載入 Flash 檔案,對事件和錯誤資訊進行捕捉,再對資訊分析來判斷 Flash 中是否存在 XSS 漏洞。

先來看下面兩張圖,以 Firefox 瀏覽器為例:

enter image description here

Firefox 訪問 http://test.com/xss.swf?alert=1,Flash 成功執行 JS 程式碼,彈出對話方塊。

enter image description here

Firefox 訪問 http://test.com/xss.swf?alert=1\",Flash 執行 JS 報錯,顯示錯誤詳細資訊。Firefox 能夠顯示 Flash 執行 JS 錯誤時的詳細錯誤資訊。

到這裡也就明白檢測的原理了,就是:

  • 程式呼叫 Firefox
  • Firefox 載入 Flash 外掛
  • Firefox 訪問對引數經過構造的 Flash 連結,比如 http://test.com/xss.swf?alert=1\"
  • 程式捕捉錯誤資訊或者 alert 事件
  • 根據錯誤資訊或者 alert 事件資訊來判斷該 Flash 是否存在 XSS 漏洞

0x02 具體實現


具體如何實現呢?我們不會真的呼叫 Firefox,而是直接採用一套開源的可以解析 JS 的工具包:CasperJS。下面看下 CasperJS 官網的一段介紹:

CasperJS is an open source navigation scripting & testing utility written in Javascript for the PhantomJS WebKit headless browser and SlimerJS (Gecko).

CasperJS 目前支援兩種引擎:PhantomJS(WebKit核心)和 SlimerJS(Gecko核心)。Gecko核心就是 Firefox 所使用的核心,又透過 CasperJS 文件瞭解到,使用 SlimerJS 引擎時候可以透過 loadPlugins 來載入 Flash 外掛。

所以我們就可以透過 CasperJS 來完成我們的功能需求,下面是程式碼實現:

flash_detect.js

#!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();

程式碼很簡單,就是透過 CasperJS 來訪問 Flash 檔案,然後捕捉頁面中的錯誤資訊和 alert 事件。在這裡有一點需要注意就是有的 Flash 不會立即執行 JS 程式碼,所以我們在開啟一個 Flash 檔案後,在當前的頁面停留 2 秒。

0x03 執行效果


我們剛才那個 Flash 檔案用這個檢測程式碼檢測下看看效果 ,如下:

#!bash
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"}

0x05 寫在後面的話


實際中我透過訪問網上的一些業務,把其中的 Flash 抓下來,然後透過程式去檢測,效果還是不錯的。當然這其中包括我們自己業務中的 Flash XSS 漏洞。

但是目前的檢測程式只能是一個 Demo,要想在生產環境中使用,還需要解決以下問題:

  • 效率:目前是單程式單執行緒進行檢測,會影響檢測效率,同時由於 SlimerJS 會開啟一個 GUI 視窗,在一定程度上也會影響效率;
  • 誤報:在 Demo 中我們沒有過多的處理錯誤資訊,所以在實際測試中會有比較多的誤報;
  • 引數:這裡的引數只是 Flash 檔案接收的引數,我們透過日誌分析等可以快速獲取業務中的 Flash 檔案,但是如何獲取 Flash 接收的所有引數名呢?

上面幾個問題並不是致命的問題,我們可以透過多種方法去解決,但是正如前面所說的這個檢測程式有個致命的缺點,那就是:

  • 這個檢測指令碼只能檢測很明顯的 XSS 漏洞,如果 Flash 中對引數有一定的處理措可能就無法進行檢測了;

所以本文僅僅做自動化檢測 Flash 中 XSS 漏洞的探討,如果你有好的方法,希望能與我交流。thx。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章