) _8 {% C! j9 V. F+ z' i6.3 极度危险的跨框架窗口引用劫持 0 e. H4 M# E) n8 b- ~, t 0 ^* d1 k, n6 P& D" W u C" a 非持久型XSS漏洞是在URL参数中注入脚本,一度被认为很鸡肋,一个非持久型的XSS漏洞4 M* s4 u9 s+ ?. U! f7 N' \
可能出现URL参数过于冗长等缺点,下面这个window.parent.opener的跨框架窗口引用技巧就2 b* |& U7 M; U$ W/ l; J5 g
适用于所有的非持久型XSS漏洞,我们可以在一个被攻击者的信任网站上的网页里iframe一个$ A. w i# g: o; i4 @& u
非持久型的XSS,如下:! X D# Q; b. k6 s0 B
) ]$ m0 }0 m0 I) C
<iframe src='http://www.target.com/index.php?vul=xss'width='0' height='0'> 4 H1 L7 n3 F% c- V& Z2 h5 n) p8 d; C1 g; t$ B2 R' G6 f9 y
在vul参数中写入下面的hijack_frame_opener脚本,跨站师就可以反向跨框架引用窗口 ; j2 V; M: q% u) r5 |' B& W注入脚本。& Z( z5 ?+ Z# V( t; C$ z
, B7 w1 c& B3 \1 G& a
--hijack_frame_opener.js------------------------------------------------------- 5 l# ?/ u/ T2 y* Z# A<script>! i+ t- ?: m: |- q
window.parent.opener.location="javascript:alert('I had been hijacking your browser!')"; 3 C& t; L$ S2 Y/ @' ^% p</script>/ N' |4 W# I' @. H
------------------------------------------------------------------------------- 4 U" f! L0 k& g; S0 {; m0 W! d" n t; r7 y9 q! i+ u 6 N6 @2 T: V6 ]/ |: W, P6.4 极度危险的正反向跨窗口递归劫持. E, p9 {( D# @1 ~
+ |8 J7 O: L* x6 T" u luoluo建议我加上了这一部分,窗口之间的引用关系可能是复杂的,我们可以通过window 9 I# C% O' I- i2 G7 K+ A9 p的opener属性链反向递归查找窗口注入XSS脚本,将互相引用过的同域窗口全部劫持,并通过* b7 ]% z b) P% T
异常处理规避之间跨域页面的访问异常,代码如下:! S0 E' w& Z: k7 {; j; R% l
0 M0 V* J7 d ]: ]7 {' K--code-------------------------------------------------------------------------5 _/ c: ~3 i0 r" n
) Z8 h- q/ B! j* e; h: a
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); ; E$ G% }- w# N; O! _1 i [: g* R/ A 3 k9 u1 b) q; g7 s- c" _, w2 Z-------------------------------------------------------------------------------6 s$ D- K: F: y" M; j0 A
/ l! @' N3 \' A8 D$ {% n 假设页面打开序列有A域->B域->A域的情况,通过对第二个A域页面的反向递归劫持则可 + b: U8 E ~8 L& l3 w* {$ |, c以劫持B域之前的A域页面,从而实现“隔空打击”。! c* k& Z- V+ Z
4 f0 _0 Z2 m: x( T- h/ \
同理,正向跨窗口劫持也可以实现递归劫持所有同域的链接,对每个打开的被劫持的页面0 p; @! D0 O& [5 R* o; l/ ?
执行和第一个页面一样的劫持脚本,但是正向递归没法实现反向递归的那种“隔空打击”。3 F1 ^8 R5 U% h6 K
- G) @8 R; j+ I+ ]
结合正向和反向的链式递归劫持,最终我们可以劫持所有的同域页面。7 T M, Y' d8 r" d2 x7 x& B' n
' ]* t9 \+ t$ I& I
/ {! G( [0 v/ y8 W# E6.5 完全控制浏览器 3 N5 m' ~% C }$ g' | / z# _& v, h' s* G" ^2 Y: a B O P1 e* V 一个跨站脚本漏洞的真正意义在程序员的角度是输入和输出问题,而在跨站师的角度则 4 Z1 M* _1 O/ i5 M y' A是能够进入同源策略了,可以摆脱同源策略的束缚做任何想做的事情。跨站师们可以利用XSS E2 @1 \) B- w+ ]" t% E' X' d2 r漏洞在同源策略允许的范围内再跨页面注入脚本,可以不再为窗口关闭后XSS漏洞的效果消失2 s% y% ?% |8 U/ j8 ~
而烦恼,劫持窗口后的跨站师们可以任意发挥,劫持表单,劫持请求,劫持输入等等,我就不再 8 \9 h/ p) D! ^列举实例。无论是持久型还是非持久型的XSS漏洞都是能够发挥最大的威力的,最后实现跨站 ' a1 k, Z Z& ^/ `师的终极目标 - 完全控制浏览器。 * a% g& |# G$ i( J 9 {# G+ i, V9 ~$ U6 b3 l% g! c+ {2 a _$ N3 ^ X7 K- a3 r& Q
七、后记5 s9 ~+ ]% h3 R, q1 l
w" G6 W1 H1 F/ M5 P# w1 P) {
文章涉及的安全技术全部都是纯研究性质,请不要将这些技术使用在非法途径上。安全 $ \% g7 R+ H; w与应用永远是一个矛盾体,通往安全的路永远不止一条。感谢对这篇文档的思路和技术给予3 k5 S0 P! L. Q" }2 R! v
过帮助的luoluo、cnqing、linx以及80Sec团队的所有成员。2 Q8 D6 J8 G# Z, A0 z! T
: c) a: v0 E6 \( e
: x4 ~$ c$ N; g) F ^( m- H
八、参考 ' {. S" [2 d. V0 v, K- N; i" [. X# }2 } K6 u2 `% A4 p
1. http://en.wikipedia.org/wiki/Same_origin_policy 7 s! @, Q6 w6 r: j2. http://code.google.com/p/browser ... licy_for_DOM_access - f; ?) p1 j2 i8 c/ ^/ I% e3. http://www.w3.org/TR/Window/" Y5 Y5 x/ I$ V D J- f
4. http://www.80sec.com/release/browser-hijacking.txt 4 R' {6 A- j- X! j5. http://www.80sec.com/all-browser-security-alert.html " M4 i) \( Q) b" K6 d$ b; N6. http://www.80sec.com/ms08-058-attacks-google.html, b) n" ]& d$ i3 [$ g' x% U- V% j/ u
9 J, ]6 h( H: x& m2 k. ^
-EOF-