3 C5 j5 i' }* j7 |5 m--hijack_opener.js-------------------------------------------------------------. R; k& B2 G1 z2 d- [! {. V1 _
7 k- W8 Y- a8 K% r Z; R
javascript:window.opener.location="javascript:alert('I had been hijacking your browser!')";void(0); * c, a$ b% [9 O$ ~# F" c; C . y1 } n$ r4 ^+ R; x. w------------------------------------------------------------------------------- - K5 B$ k% w5 ]) n3 X) k# s: R- t, f4 b @3 F! Y& c' W! F, z
( r0 I* U0 o# k3 m8 w) Q. e8 r6.3 极度危险的跨框架窗口引用劫持 " Q/ K+ E) {. H3 S) f$ L0 T! _5 o7 l% t/ V9 G/ M
非持久型XSS漏洞是在URL参数中注入脚本,一度被认为很鸡肋,一个非持久型的XSS漏洞 5 k- O& q+ i' g6 _可能出现URL参数过于冗长等缺点,下面这个window.parent.opener的跨框架窗口引用技巧就 0 q+ b8 p1 O- x$ @1 x# X适用于所有的非持久型XSS漏洞,我们可以在一个被攻击者的信任网站上的网页里iframe一个 9 d6 \4 V, F/ l' q( u s- D+ l" U6 h非持久型的XSS,如下: 5 A3 f; `& Z6 [# t0 O* W1 g. m3 i( f+ Q' j
<iframe src='http://www.target.com/index.php?vul=xss'width='0' height='0'> ( P, p4 W9 _* n3 Y8 X2 r6 m; D4 V8 j% C/ W0 G+ ^) N
在vul参数中写入下面的hijack_frame_opener脚本,跨站师就可以反向跨框架引用窗口7 q+ G4 Q) t$ | P- T% Y
注入脚本。 2 d( V1 u9 s0 G$ V: { / V6 D B: f( i$ A8 z# D, t3 M ?( {--hijack_frame_opener.js-------------------------------------------------------" O# t& o( \$ _& X
<script> 9 `1 W( @5 r2 h4 x' Nwindow.parent.opener.location="javascript:alert('I had been hijacking your browser!')"; ) s% Y% l8 Q$ A! P+ U</script>5 |& A; J( L* y, h3 ]
-------------------------------------------------------------------------------* K9 t- y7 v6 V
* e" J7 A* ?3 i" D
& S" \* P G! M- S9 B
6.4 极度危险的正反向跨窗口递归劫持 ( i' c( o t- c2 F' u. G) K$ A8 s2 I- _, r+ R4 w+ x8 i* ?
luoluo建议我加上了这一部分,窗口之间的引用关系可能是复杂的,我们可以通过window 6 q9 {7 m4 O; k5 M( \的opener属性链反向递归查找窗口注入XSS脚本,将互相引用过的同域窗口全部劫持,并通过' K1 e0 C6 o! |4 \/ Y' h2 m/ O
异常处理规避之间跨域页面的访问异常,代码如下:# @, o7 u8 ?, t3 @
- R, L+ _3 H `! E--code-------------------------------------------------------------------------+ l: x# n) @6 h4 H: I/ O. g
" n! p2 X) c& Z$ E: j7 t8 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);& c; Q1 z& {+ |2 a T# L
! q5 w7 [; k& ?+ q% T------------------------------------------------------------------------------- + }* m- r) D d. q0 N `8 ?' ?3 J* A: o* y# `) w
假设页面打开序列有A域->B域->A域的情况,通过对第二个A域页面的反向递归劫持则可 0 k: g+ U- j. [3 ^2 D, U以劫持B域之前的A域页面,从而实现“隔空打击”。, j; Z7 [: b& ]. h# ~
' { l* {# K _, i) J5 H) M8 i 同理,正向跨窗口劫持也可以实现递归劫持所有同域的链接,对每个打开的被劫持的页面0 b) b+ C- u! P8 Y3 U/ o5 r+ L' s2 x3 H9 W
执行和第一个页面一样的劫持脚本,但是正向递归没法实现反向递归的那种“隔空打击”。 $ _. E% Q; z+ y% E% j g 9 S! x ~7 M9 q- w# ~1 B2 M1 o 结合正向和反向的链式递归劫持,最终我们可以劫持所有的同域页面。 * v% n. n w( U1 W- c( p( P7 Z( o7 a' ^1 t+ x
/ j1 f/ c9 Z' ~. J6 }0 C& f
6.5 完全控制浏览器 * K& Q" p& p/ Z' G 2 g/ @' e, J; D: f7 Z 一个跨站脚本漏洞的真正意义在程序员的角度是输入和输出问题,而在跨站师的角度则 ! |* Z9 b. j) h4 o是能够进入同源策略了,可以摆脱同源策略的束缚做任何想做的事情。跨站师们可以利用XSS! A, y. k+ X1 g: z& u2 E: _
漏洞在同源策略允许的范围内再跨页面注入脚本,可以不再为窗口关闭后XSS漏洞的效果消失 7 r, Z0 a: `5 ~而烦恼,劫持窗口后的跨站师们可以任意发挥,劫持表单,劫持请求,劫持输入等等,我就不再- r( }8 {5 ?# Y& P+ y
列举实例。无论是持久型还是非持久型的XSS漏洞都是能够发挥最大的威力的,最后实现跨站 : |+ {; m% R; z师的终极目标 - 完全控制浏览器。 ' U& y, E! J3 C* b+ D7 M ]) V 2 X* a) c$ d- i/ H2 N; E7 ?4 d- X4 h3 F! V0 f% P9 g: p
七、后记! t C9 {2 d5 n0 Y