4 Z3 p# i- ~0 x: B0 B, f4 s 注:各大主流浏览器仅opera和internet explorer 8不存在窗口引用漏洞。8 q$ f( _$ g k7 ~8 u
: D3 F2 R* H, d. ] 3 i" O' z9 F. W% a六、利用XSS漏洞劫持浏览器 9 g! |; @5 y' Q+ ~0 @, ^ 8 V5 S4 f" d. N5 U 延续第四部分的思路,这部分将进入本文的一个重要环节.跨站师们都知道XSS漏洞分为/ r4 P! |$ O0 ~8 p- u2 d- v7 `$ o' J
持久和非持久两种,这两种类型的漏洞无论怎么利用都无法跳出窗口的生命周期,窗口关闭后) d' E8 B5 v$ Z- ^
XSS漏洞的效果也就完全消失,窗口的限制一直束缚着跨站师们的发挥,我这里将和大家一起! L" j) z& A3 M- i. l% C" u0 L
讨论跨站师的终极技巧: 7 |1 N- A9 X" x$ i- \# [4 D6 B0 h4 N+ J- b- b/ o) m
% D: s6 M/ { @: U- b7 M6.1 正向跨窗口劫持" O- @5 O. b, d6 ^) J
4 u8 Q$ l& _. g" J3 c" d1 f2 G# \
大家可以先试验下hijack_open.js这个脚本,比如打开http://bbs.dvbbs.net/动网论坛 2 t' U W% @& l6 D主页,我们在地址栏里复制下面的代码使用伪协议注入hijack_open脚本,然后整个页面的链1 u! b a/ d$ C) D
接就都被劫持住了,点击论坛里的任意一个链接,打开的新窗口都会被注入了一个alert对话 4 B7 P# f) A" E; h# Q5 s& u* S框脚本。 ; P$ ?# o# f6 d, a* O, Y. V
% h" L" M( h% F; \--hijack_open.js--------------------------------------------------------------- ) i- g0 A: I& s' `* _5 k% S' {8 e2 D. _# o. a. N% e
javascript:for(i=0;i<document.links.length;i++){document.links.onclick=function(){x=window.open(this.href);setTimeout(function(){try{x.location="javascript:alert('I had been hijacking your browser!')"}catch(e){};return false;},3000);return false;}};void(0);! E: x7 L/ ?* P- I% P0 E
) w. k" O5 ^9 K------------------------------------------------------------------------------- - f; ~, x6 Z! K) ~' C8 [$ \; i1 P2 _9 A$ T8 O# }. Q4 X; C
' A, \- T4 y: t1 q6 m
6.2 反向跨窗口劫持' G. J7 X, G9 _. U8 J
6 ~6 }8 ~6 D* J4 O- ]# \( M6 j7 c4 T 同样我们也可以在动网论坛试验,新打开任意一个版块的窗口,在地址栏里复制下面的代& ?, Z( V5 }0 q2 y+ t% P5 p- P/ ]( ?. o
码使用伪协议注入hijack_opener脚本,我们会发现原来的页面被反向注入了一个alert对话0 X0 O+ x: f0 ?9 m
框脚本。 Y. G+ k a& G. j/ _$ @/ y# ?
) C) V( D7 Z9 u/ X( V
--hijack_opener.js------------------------------------------------------------- ; A: R' m& E: w: `2 k* `: x x1 q9 v& a! k
javascript:window.opener.location="javascript:alert('I had been hijacking your browser!')";void(0);7 b( @# `, H# [, |
, {# Y* e, X1 n/ w
-------------------------------------------------------------------------------) H- f8 @& O. X, k5 [! U6 f
, [4 Y% c) ~/ w) h
" Q9 y' W* q! ?8 M/ }
6.3 极度危险的跨框架窗口引用劫持5 q, i6 \4 Q: S/ p6 j
. A- m7 f; o7 R7 Z' l: }! ~9 ~
非持久型XSS漏洞是在URL参数中注入脚本,一度被认为很鸡肋,一个非持久型的XSS漏洞: g) j$ I' v; ] m0 @" p7 `% l
可能出现URL参数过于冗长等缺点,下面这个window.parent.opener的跨框架窗口引用技巧就 w, H; y$ V& f/ g适用于所有的非持久型XSS漏洞,我们可以在一个被攻击者的信任网站上的网页里iframe一个; x! c. T0 N; }' w, T
非持久型的XSS,如下:3 {5 ?' H- B! t5 }4 D
% y- m X2 O4 e/ ^/ U
<iframe src='http://www.target.com/index.php?vul=xss'width='0' height='0'> ) {, t; d$ e4 l: R* ]1 Y* U% x, V" x" n" g6 ]
在vul参数中写入下面的hijack_frame_opener脚本,跨站师就可以反向跨框架引用窗口% u' a& d) |$ i8 H% N
注入脚本。% ]% d, j0 X8 N: [; Y0 Q
3 l' E" i9 W/ {/ u7 e$ T
--hijack_frame_opener.js------------------------------------------------------- # _1 [* G- K- b; u/ U0 _8 o" V0 `<script>7 O0 F" ~0 s/ k
window.parent.opener.location="javascript:alert('I had been hijacking your browser!')"; + M6 f( U3 ~9 ?( i w* v& s</script> , L5 B/ h* ]7 R! I3 t------------------------------------------------------------------------------- ) Z. R, A- s! k9 @3 @3 N j& I0 i* R: r
5 ~ h% V* g- p" F
6.4 极度危险的正反向跨窗口递归劫持3 R* q7 o9 a" S0 a, ]; d
" w% G" b5 {, m/ `
luoluo建议我加上了这一部分,窗口之间的引用关系可能是复杂的,我们可以通过window ( w* f5 }, y: h的opener属性链反向递归查找窗口注入XSS脚本,将互相引用过的同域窗口全部劫持,并通过 9 j; S0 @$ X. ?1 b异常处理规避之间跨域页面的访问异常,代码如下:# [ r( }9 {* h1 s) v$ ?
. x+ M; O. d- Y5 K- u/ c
--code------------------------------------------------------------------------- 6 x! {% E8 O7 e. D1 \% N% B% ~8 j( _0 `" B# |
javascriptfunction(){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);; ?: z: }. Q' {% K( G
& z; t0 E6 } w/ ^& _4 S------------------------------------------------------------------------------- & h3 h& M$ T9 ?- ~8 r+ V/ i4 F& F8 I * g4 v- B9 M% @ 假设页面打开序列有A域->B域->A域的情况,通过对第二个A域页面的反向递归劫持则可' Y, a/ M. N: G: Y1 {9 A+ _
以劫持B域之前的A域页面,从而实现“隔空打击”。 6 ]* y& t/ Z/ D4 ~- l 1 R& `$ y$ p* E2 ]# I5 ]) d 同理,正向跨窗口劫持也可以实现递归劫持所有同域的链接,对每个打开的被劫持的页面: T0 \$ M; E' j4 n- Z* Z
执行和第一个页面一样的劫持脚本,但是正向递归没法实现反向递归的那种“隔空打击”。 2 I# X/ K2 y0 v) m6 b1 n 9 u* d: d! i) @) i, I, d 结合正向和反向的链式递归劫持,最终我们可以劫持所有的同域页面。$ \ ?8 N7 M% M
! J0 m5 n q$ Y6 b. H. E4 k