當前位置:編程學習大全網 - 源碼下載 - 註入漏洞的檢測方法

註入漏洞的檢測方法

目前比較準確的檢測註入漏洞的方法是進行網站漏洞掃描,推薦EeSafe網站安全聯盟。

查找與修補

壹、註入點的查找

當我們想要測試某個站點時,壹般會架上註入工具對其狂轟亂炸,這樣做雖然有時能找到註入點,但還是有些盲目,我個人的看法是:如果有源碼的話,就從源碼入手,在源碼中查找註入點。對於源碼,有些朋友可能覺得很難,其實源碼並不神秘,它也是有壹定的語法規則的,看壹套優秀的源碼就像是在欣賞壹部精美的電影,只要我們堅持每天看壹些優秀源碼,再加上百度這個老師的指點,用不了多久,源碼的神秘面紗就會被妳揭去。閑話少說,下面我們就開始查找註入點,目標有兩個:壹是Request,二是SQL語句。

說到Request,這個是ASP程序中的壹個內建對象,怎麽?不懂?那就跟我先來惡補壹下吧!它是用來獲取客戶端信息的,有五種方法,而會出現註入點的壹般有以下三種:

1、Request.QueryString:取得客戶端提交的信息。當Form以Get方法提交信息,或是直接在URL中提交變量值時,在服務器端接收數據時采用的就是這種方法。

2、Request.Form:同樣也是取得客戶端提交的信息,但它接收的是Form以Post方法提交的信息。

3、Request.Cookies:取得客戶端瀏覽器的Cookies信息。Cookies就是小甜餅,指的是壹些私人信息,如用戶名、密碼之類的信息。

有些程序員為了減少錯誤,對於前兩種信息的獲取,會采用Request來取得客戶端提交的信息,這種方法,雖然可以通吃Request.QueryString和Request.Form的提交信息,但如果過濾的不好,就會被漏洞反咬壹口。

了解過壹些Request的知識後,下面就在“查找”中輸入“request”進行搜索,OK!當找到上面所列的三項Request語句後,再來看壹下程序對這些Request語句是否做了過濾,比如ID值是否用INT過濾,例:id=int(request(id));字符串值是否用replace ()或instr()等函數進行過濾單引號或壹些特殊字符,例:username=replace(request(username),, );或者程序是否采用本身的壹些過濾函數來過濾這些提交值。從查找到這句request參數起,壹直到SQL語句中使用這個提交值至,如果中間沒有上面的層層關卡,那麽,壹個註入點,基本上就算是出現了。

說到SQL語句,不能不提到以下幾個常用的語句:

1、查詢語句:Select [(<字段名1> [,<字段名2>, ...])] FROM <表名JMDCW> [Where <條件表達式> [AND|OR <條件表達式>...]

2、更新語句:Update <表名JMDCW> SET 列名1 = 常量表達式1[,列名2 = 常量表達式2 ...] Where <條件表達式> [AND|OR <條件表達式>...]

3、刪除語句:Delete FROM〈表名JMDCW〉[Where <條件表達式> [AND|OR <條件表達式>...]]

這裏不對SQL語句做介紹了。在上面列出的SQL語句中,註入點出現頻率最高的是Select語句,而註入參數的出沒地通常都是在Where之後的條件中。當壹個沒有過濾的Request語句進入SQL語句後,就是註入大顯身手的時候了,不過,在進行註入之前還要先看壹下該參數是直接引入,還是用單引號引入的,另外,該參數是否還應用於其他SQL語句中,然後,根據不同的信息,選擇不同的處理方式,或直接暴破,或UNION查詢,當然,如果存在註入點的程序使用的是SQL數據庫,那就不單單是得到壹些重要信息,甚至還可以增加管理員。

下面用“螞蟻影院3.0”版註銷用戶(wantlogin.asp)中的壹段源碼來做壹下介紹:

引用

<%

if request(userid1)<> then

set rst=server.createobject(adodb.recordset)

sql=select money,online from users where userid=&request(userid1)& and password=&md5(request(pws))&

rst.open sql,conn,1,3

if rst.eof and rst.bof then

response.write<script>alert(用戶名或密碼錯誤!);history.back();</Script>

else

response.write<script>alert(恢復成功妳現在可以登陸!);</Script>

response.write<script Language=Javascript>location.href = index.asp;</script>

rst.close

set rst=nothing

conn.close

set conn=nothing

end if

end if

%>

在其流程中,首先判斷取得的提交值userid1是否為空,不為空的話就進入SQL語句中,驗證取得的用戶名及密碼是否和數據庫內的用戶名及密碼壹致,如果不壹致,則彈出“用戶名及密碼錯誤”窗口,否則,就彈出“恢復成功”的窗口。這也是壹段典型的註入漏洞源碼,並且,接收的方式還是使用的 request,這就給我們提交註入語句提供了最大的方便。如果我們在URL地址中提交如下字符:http: //127.0.0.1/wantlogin.asp?userid1=aa&pws=bb,因為沒有aa這個用戶,那麽就會彈出錯誤窗口,而如果我們將aa換成如下字符:aa or 1=1 or 1=1,pws保持不變,這樣提交的語句到了SQL語句中就成了如下語句:

select money,online from users where userid1=aa or 1=1 or 1=1 and password=md5(bb),以往我們所見到的測試代碼壹般為“or 1=1”,而這裏卻多用了壹個 or ,為什麽要多用壹個or呢?解釋壹下,在邏輯運算符中,and的優先級別高於or ,程序運行後會先運算後面的1=1 and password=md5(bb),因為密碼是隨便輸入的,所以and後的password值為假,而and前的1=1雖然為真,但真and 假=假,所以,這個and的運算值為假,再來看or運算,因為前面的用戶名也是不存在的,其值當然為假,如此壹來,where後的邏輯運算就成了如下表達式:假or真or假,結果值還是為真,這樣就會彈出“恢復成功”窗口,如果將其中的or 1=1 改為or 1=2,那邏輯表達式則成了:假or假or假,值當然也為假,彈出的就是“用戶名或密碼錯誤”的窗口。這樣,根據彈出窗口的不同,我們就可以構造壹些特殊字符,然後猜測出需要的數據了,比如查詢管理員ID的語句,將or後的1=1更改為: 1=(Select top 1 id from admin),這裏暫用admin表示管理員表名,如果存在ID為1的管理員,那麽就會彈出“恢復成功”的窗口,否則,就證明管理員的ID不為1,那就要再用其他數字來測試。猜出管理員ID後,再把此段字符更改為猜測管理員名稱長度的字符:5<(Select len(adminname) from admin where id=1),如為真,則證明長度大於5,否則長度小於或等於5。猜出長度後,再用asc()函數來猜測管理員的名稱:90<(select asc(mid(adminname,1,1)) from admin where id=1),如此循環,就能暴破出管理員的名稱及密碼了。

上面提到的是Request.QueryString和Request.Form的註入方法,而Request.Cookies的註入方法則是要修改本地的Cookies值來實現的,推薦使用壹些專門的Cookies修改工具,不過,用Cookies來註入相對而言,就麻煩了好多,但原理和前面的註入是壹樣的,這裏就不介紹了。

二、註入點的修補

在上面著重講了如何查找註入點及簡單的利用方法,當我們知道了攻後,也就明白了如何守,攻和守之間雖然是對立的,但也是相互的。明白了什麽地方存在註入點,再來修補也就容易多了。在前面查找註入點時,我也提到查看程序中是否對提交參數進行了過濾,每個程序對註入的過濾函數都不相同,我們在修補自已站點上的註入點時,可參照其他程序中的過濾函數,也可根據自已的需要,單獨過濾壹些敏感的字符。這裏,還是以上面的那個例子來說壹下如何修補註入點。在前面的 SQL語句中有這壹句:userid=&request(userid1)&,這其中對提交來的參數是用單引號來引入的,而我們能成功註入也是在提交參數中加入了單引號來閉合其語句,這樣,加入壹個replace()函數對單引號進行過濾,修改後的語句為:userid= &replace(request(userid1),,)&,這樣用戶再提交帶有單引號的字符時, Replace()就會將單引號過濾為空,如此壹來,提交的那些特殊字符也就失去了其意義。

當然,我們還可以在userid1進入SQL語句之前,對其長度進行壹下判斷,如果超過規定的長度,就彈出錯誤,中止頁面執行並返回到指定的頁面。當然還可以借鑒壹些優秀源碼中的過濾方法。總之,註入漏洞是可以避免的,即使出現了註入點,只要我們分析出其出現的原因,也就能很容易地將其修補了!

  • 上一篇:春特寫作文
  • 下一篇:動作描寫作文訓練題
  • copyright 2024編程學習大全網