" ~- d% p5 T9 L' M0 g& }' [9 {" L: m. b2 P+ B+ k d/ m
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 3 j$ ^0 m4 c: f% K2 M# ?
X Web Security - XSS & more X 7 R* w$ s8 R1 A6 z) O) Z
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - _- a' a& {5 o0 ]1 M
# O! r) P3 H! z / E7 {1 ^5 j" R$ U9 R y5 d- F~介绍 , l& ^: x. ?1 J+ v% L& y3 f6 f' E& |# F8 p2 E8 p3 L
在这篇文章中我将说明所有关于XSS以及更多相关的知识.通过这篇文档,我希望能让你明白什么是XSS,为什么使用XSS,以及怎样使用XSS.一旦你学会了,你将需要发挥自己的创造力,因为大多数人都修补了简单的XSS漏洞.但是他们所忘记做的是修补比XSS的一个字符串更多的漏洞,并且php中特殊安全机制被用来防御XSS,而取代他们自己的方法.同时我将阐述的不仅仅是XSS,而是所有的web安全.0 h' y- R, f# u4 \; L$ m9 A
6 X" Q! U3 y& O! h* k# R* rXXXXXXXXXXXXXXXXXXXXX ' G7 C" q5 z O. u& UX Table OF Contents X ! q! B! i, G! H- B
XXXXXXXXXXXXXXXXXXXXX / Z: M3 G* I1 d% w5 s& |6 K: O# y: s8 J1 ~" H- \0 I
XXXXXXXXXXXXXXXXXXXX : p6 `3 D8 L( @( R- LX Cookie Editing X 5 w1 _. ^4 U' H. Y, P/ SX XSS X + x s$ g1 p5 H- U$ ^X SQL Injection X 8 j( m1 u/ r0 u, vXXXXXXXXXXXXXXXXXXXX 4 e3 \( G$ x4 D" Q 2 j, _) g! q) {! J# ~, Q- m5 P% k~什么是cookie 2 V+ {5 T9 l L/ z9 F) G0 G: l; S; N- q- E
cookie就是一块数据.一旦你浏览一个站点并且注册一个帐号,一个cookie就被设置以记录你的信息.cookie仅仅保存你登录的信息以使站点检测以前你是否登录过,如果不是,它就会检测你的用户名和密码的正确性,然后登录.比如说在一个夜总会,你买了一张票,他们就会给你一张卡.因此你可以进进出出而不用每次都买票.而cookies比你所能看到的要复杂得多.夜总会只能记住你一晚上,但是cookies却能记住你一辈子. 9 r K6 v1 {+ Q' V, n5 I: ~- m! f. c) X4 i0 p2 |
~警告&欺骗 $ F N# }4 ? u: ]& \6 x# |* {/ D* I) e4 m$ n" w
那么现在你知道了cookie是什么...你如何看待它们?事实上,cookie编辑(修改)是最简单的方法之一.只要有一个浏览器,你就能够查看和编辑cookies,并且只需要一些基础的javascript知识.打开你的浏览器然后随便去一个网站吧,登录...现在输入javascript:alert(document.cookie).这时你应该可以看见一个用户名和密码.然而大多数站点现在都不使用cookies,而使用sessions.很遗憾,sessions不能被修改(服务端可以),不像cookies,一旦你修改了一个cookie你就可以欺骗你自己.现在让我们开始欺骗...假设你看到了一个警告框并且看到一些像这样的内容:& P* l) z( z" R# y
6 |+ O9 \. K/ e) T+ Kstrusername=cnsst;strpassword=cnsst+ l0 z: e& N. s- s. w
7 v3 A: W/ U7 n' C8 |5 N! j$ a此时假设你知道'bitch'是一个管理员,可是你不知道密码. 由于脆弱的安全机制你不需要密码:javascript:void(document.cookie="strusername=bitch") p6 @ A- W7 n p; }% c
现在输入:javascript:alert(document.cookie).那几乎非常接近cookie修改了... : c; C$ [9 N9 N& t, E0 c & h X, `) t* q( J~什么是XSS : b/ _/ \& _/ P1 h9 `. w: [1 c7 E5 B! r) a1 M/ @4 R- y
XSS,或者CSS,不管你更喜欢怎样称呼它,XSS(CSS)都代表着跨站脚本.基本上意思就是你能以任何方式注入脚本,来让它完成你想要做的.通过XSS你也可以截获输入信息,像用户名,密码以及cookies.这都将被讨论,所以接下来将会有很多例子,我们这篇文章应该能够帮你在XSS上发挥自己的创造力.! p( E8 c* j8 e" j2 R
) n6 P0 N1 A% `) ^" `7 n~为什么使用XSS- r, \; E) R V: \9 N% x5 r* Z
3 u/ Z" j( t1 x2 a# M8 S
很明显的问题,通过XSS你能在客户端和服务器端执行任何类型的脚本.然而XSS却不仅仅局限于执行脚本上,还能截获输入.输入类似:<input name="name" type="name"> 5 w5 @( E0 N: E3 a你通过XSS截获输入,然后通过一个秘密文件把截获到的信息发送向你的站点.而这一切绝不是XSS所能实现的全部作用.XSS还能截获cookies.Cookies保存着有价值的信息,像用户名,密码等等. 7 O: j L7 [- } & g$ O5 [: {7 B0 {$ Y. K0 s* ~- P. F~让我们开始吧… ' N' \$ }4 }! Z* |. Q& Z% |' p4 }$ {4 H1 J7 G
我假定你知道html和javascript,而php知识也有帮助,但却不是必要的.让我们从这个php脚本开始. / Y# M6 J+ b9 {3 B, D2 V/ q# K ! f9 j9 x, K& Z4 R0 T O0 C; U( [XSS--跨站脚本<html> 1 n y( {) e! @# V, x+ e. ]: K
0 h3 d! j" R8 P, f. S% a
<body> ) H7 u1 ]9 [4 t+ z" ^2 @6 C2 A5 `; {1 |5 L" i+ \7 j' s P$ d' Z
<form action="" method="GET"> ' Z: P# w+ o& p1 X: z* S; ?3 `, F" x
<!-- 我使用的GET方法,因为当我们利用的时候更容易练习. --> - ]2 [& W4 A1 b+ Q4 g4 e3 h6 x% v7 g3 a) t' d
Script: <input name="name" type="name"> + g4 _7 \) ?$ S: C( M4 `/ j* O1 v& G! R
<input type="submit" value="submit"> - D6 }' q6 W9 X( M# p2 Y) R
9 M. ]7 ~6 Q' J) g6 j/ f8 y2 C2 v
</form> . L- `3 B8 c5 ~4 n( l, L
( o) ]! v2 S, r' n( D) ~- N# B x+ @
</body> 5 x* ^$ g' _. p' {" d3 I0 }" d$ N, Q4 M( D
</html> 2 \9 G, H# B; K6 Q9 l r5 Z F $ ?6 W" N$ \1 N+ n' }7 | A3 C5 U& G9 {& w9 ^3 Q- }; f
9 y) C m7 {. a; |; f, K<?php , x- s. R1 _6 F# u T1 }3 @# d! X
& L" m% N. D$ `8 V' {, ]
$name = $_GET['name']; $ {* b* w5 j% W5 u& z) T$ v 1 Z8 i5 ~- |' l9 H% s2 B* r$ ?echo("Hello $name"); : T- s. b2 k* @ ~, w" p9 [' ?0 z% H* c1 }
?>+ b+ f, B! \- T( M$ Q% C, X( Q
复制代码OK,我们应该都知道上面的代码有什么用...这是一个非常奇怪的脚本,没有一个人会在自己的站点上使用它(至少我没见过),但是它对初学者理解原理却真的很有用.来看看我输入后所得到的信息: , T! V& J# m0 }) l/ g7 e6 A& T% |; ?- `0 B+ {
cnsst * `2 {( T! y( M' A6 J$ O$ }( y4 y"Hello cnsst!"* |0 `4 S* c3 H6 ?. f5 e2 |
+ D! T/ M! I% H3 u
引号内的信息就是输出信息..注意看,现在我输入:' _$ o) b K% Z/ |8 E
<script>alert(document.cookie)</script> 9 \! a2 C" `2 B: z' H " x |( v. O9 |4 O那么它将会弹出document.cookie!所以它是易受XSS攻击的! . |* f8 m1 D F6 e- P' w1 S t5 E3 e5 G+ B1 x" z. A- ^5 g g
现在我们已经对XSS有了一点了解,那让我们理解它.首先,脚本做的是取得你的输入然后粘贴它.嗯...也就是说我们能输入任何数据.所以?等等...任何数据...好的,你想问客户端和服务器端分别有什么语言? 让我告诉你,基本上客户端语言是建立在你客户端浏览器之上的:JavaScript,html, VBScript等等...9 l1 L1 e! b" b
% e' P/ v* Q4 |2 P" e
服务器端语言在另一边,不是建立在你客户端之上的,而建立在服务器之上,有php,asp等等...0 \8 t/ k5 i% S" r
5 h7 P3 p0 b+ A5 T/ a Z
已有一些方法注入php,稍后我将说明.现在先想想这怎样才能对我们有帮助?注入javascript?简单.比如说你正在编写一个网站程序,由于是你的站点,所以你能使用所有你想使用的javascript(JS).因此其他任何人也可以,因为XSS允许你让网站运行你想要运行的任何脚本.- I9 q i6 u# y7 U8 @% Y- c u
) M' [1 q' b6 n" b让我们看一个稍微复杂点的例子! 2 F9 F+ O5 w& i* M; T3 l" m, J' X# C6 v& r$ ~1 O- K. g e
假设你已经输入了<script>alert(document.cookie)</script>,并且回显是这样的:# ?) ^, v. Q" o/ B2 W0 X; J
scriptalert(document.cookie)/script' I( Q) D- |4 ~, w' @
或者可能是这样的:* i: f9 D) Y0 |+ _6 e9 A4 c% R
scriptalertdocument.cookie/script 9 y! o5 ?8 z4 i7 C! Z3 ~1 f% G; A- E: |6 q; ~( x
可以看出更难利用了...不过有很多方法使用XSS,这只是其中一种.而且是其中最烂的方法之一.你看到当中的"<>"都被空字符" "替换了. 0 |. m, p* E' I0 H* s+ M) t5 U, W, h8 K' S4 w [) ^6 H: n( [
让我们继续利用:6 F& f; a* @1 w7 x7 T& P2 O k
<<script>>alert(document.cookie)<</script>> ( k1 b6 E% [6 P* @# F! x
) M+ K/ t' o: X! O) s1 a% Y( F你的输出将弹出document.cookie. . p" b- ^/ j" X/ }5 f% J C5 k% A1 h, ^2 y v, { ~% F/ u
现在来看看更狠的:: u1 ]. v' b* O( u
<<script>>alert((document.cookie))<<//script>> % d9 {- g) y/ F/ [; T$ g5 {* a$ G: ?* n
* J- @ x U6 e
他们可能会替换所有的,或者只是"<>".所以如果一对不能得以执行,另一对就可以.现在,如果你看到:# }2 `9 y: D. m$ w) X
scriptalertdocument.cookie/script 5 f/ D- Q8 U5 w1 H# _4 n- x- t
或者 <<<script>>>alert(document.cookie)<<</script>>> 0 ~+ p& N1 Q4 y2 O ' J6 y' U5 e# p8 m他们可能替换2对来欺骗你,或者替换一些字母.试着用你自己的方法来利用...你输入: 2 g3 X; ]& f/ m<script>alert(document.cookie)</script> 4 q4 K9 k+ J$ O. i- }" H8 V; H: N' p. w/ [
输出像这样:srplert(document.cookie)srp & k+ w( ?- }, X5 u; b! S. S+ y0 G: E8 D% K2 G8 \! v$ H
仔细观察,你就会发现document.cookie中并没有什么被替换.为什么呢? 因为他们并不清楚你想要alert什么,以及你想做什么.所以他们只是猜测,就只阻止了"<>"以及script部分.怎么绕过?看看这个:* D. {) J( h0 B1 W" J
<<sccriiptt>>aalert(document.cookie)<<//sccriiptt>> ) {/ z y% b8 E! L7 V7 u4 x8 C; o3 c3 `" n
所有重复多余的部分刚好被替换!现在让我们来点更高级的! : }2 o2 `1 P, y: \* B: I+ ^4 J. m9 w. n& [ Z6 C P
这次他们使用的仍然是替换,但是却检查了整个字符串!例如: , |! G8 w4 q+ S+ \- J& D<script>alert(document.cookie)</script> 2 L8 W* q- f2 c0 z
# o, D. p3 u0 f7 Z5 u
输出将是: . w g" E) r- W8 i9 sscriptalert(document.cookie)script / j( x% Z' b3 I5 ~5 \* _2 @9 B' K) O7 Y8 y& v1 _( J N) c# V
看到这,你激动地说,"我知道该怎么做了!" OK,让我们按照你的方法来重新构造:- ~$ I% r9 Z/ [" H
<<script>>alert(document.cookie)<</script>> 8 T! h3 Q( z8 S
( [" _! G2 {7 X* H" d& y输出:scriptalert(document.cookie)script. 这时你可能会继续增加更多的<>.可是,他们替换了任何"<>",无论你输入多少个...看到我说"任何"了吗?使用下面这个例子:$ c" c i$ a2 I; v4 `4 ~( d3 l
2 D5 v( B# S9 z4 A< : h H! ?$ y2 K; q, [8 W. q
script # v8 e. `3 z6 H- ?& `> " \) D2 K8 g: w$ Y; Z, N, y
alert 0 F1 n2 _0 Y% ^) b, I/ S( / n$ F. D/ g0 e" M6 r# Xdocument 8 g7 R! h. N' P. 9 z9 V% x/ G! L D& k$ a. a! D1 gcookie 4 ~- \* S: X+ m8 n0 o* {; R
) 6 j" J4 V2 K( f( l$ m6 v9 m. X
< 7 b/ F( X/ e& B0 ~: H/ a/ 6 c+ S: b5 a3 C: U$ \* {4 u# jscript 6 O+ y' @& v/ B1 Z+ M; ~> + {; w4 p7 G+ o3 i " S( \# t4 f" O, o# `& x2 K1 r: Z 7 e/ t( A+ t% J( D" w4 i: [看看它,它没有替换"<>",它替换代码关键字.所以即便你写的是一句没有"<>"的代码,将仍然被替换,这就是我们为什么这样写的原因.假如对方使用更严格的标准,替换任何类型的代码,甚至是"alert"! 我们又该怎么改进呢?看看这个: F3 f$ P$ ?, b: K5 O2 |' P8 z
<* I/ ~% J, b* z+ R! Z- L
s # b$ W7 g6 K. ? zc * P6 ^3 `' Y# h% A
r - I) { _8 o, p* J/ F
i w( l$ d, T2 ~$ [
p 7 H, I: q. B% l+ `
t + j: p @# V `- e2 P+ a> ; Y3 P8 J0 c9 U L
a * d* n" G+ y% k& g2 D) Vl 4 K- f9 u& m7 g1 Z& C
e : p; L7 [5 P- {, L/ ?
r 3 Q! P: [! P6 W( r" E6 G" b
t 7 } S$ M# ?" J
( ( u! X( Y2 k" ~2 O gd ( F; z' W- M) z2 Q$ uo $ H0 X" @/ s; Q3 r% ec 8 v8 z: x5 ~' Z J3 B1 ~u # H5 B# r' x5 B* bm 9 T0 |6 W2 {1 I% w' \$ o8 Q9 I
e $ v1 k9 w/ a7 W2 ] P9 ^n * [+ ^, q% F# l+ h at 1 z5 s1 P8 b& C+ \& [3 g% m. w/ U/ i1 }. h& e
c ! {" Q. T% Q0 j9 V7 [o ) p9 a4 C: h8 yo : A+ A+ V9 j# x5 D
k / K* z. k' J9 l Z. e
i 8 @- w/ h" \% N
e H [- g% k, N' z4 G! K% S
) $ p2 | @" f% u/ j< " h4 t1 V) A% x- U, C0 X* p/ 1 P& P$ w, y/ d( `6 ~& ~
s 9 G, A) @ \3 b& s# c5 K1 H
c # I% V. n( o2 ~+ \: {) pr 3 |9 Z9 H6 j% ^* T7 R: H0 Y
i 9 p4 s/ t6 h/ d- S
p - P* i+ S5 P, }( ^t V- s; e9 t' a1 o0 |
/ " F( o. k8 r/ y* I' e5 O# O- T
> % d: s" }' n9 Q6 I 4 F* ~. }& E- }8 _ d0 y, `9 u9 m6 m这下应该可以了,但是如果他们仍然替换"<",你可以增加2对"<< >>"(并且你可以用任何字符取代document.cookie) , k* A/ s& u2 @3 E# z* ?% R5 Z b; f! {& f3 M: X$ |
还有更多我可以演示的替换,但是我教你的只是想让你发挥自己的创造力. ; M" _$ P' V z5 j# f2 g2 V & T/ \' b( @1 E! @# j5 \. A现在让我来讲讲其他XSS方法.前面我们已经讨论了客户端XSS,那么现在就来看看服务器端XSS. ( `1 q, z% u4 S' z! Y N I: X, V. ]
首先让我说明它们之间的区别.客户端是从你浏览器经解释语言,如JavaScript (JS) VBScript (VBS)等而看到的.服务器端XSS是通过来自服务器端的语言,如php,asp等的XSS.客户端通过浏览器查看,服务器端通过服务器查看.2 B- f& r. V+ c% u2 U9 D* n( C* q, s& {& K