查看單個文章
舊 2006-10-31, 02:33 PM   #15 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

[漏洞]如何過濾'or'='or'!!

現在很多的公司網站的後台漏洞是大的叫人害怕
只要寫入'or' '=',

就可以順利的登入它的後台管理
針對於此,大家都是如和處理的?

希望各位發出自己的檢驗,完善下這個帖子,

PS:為安全做點力量

我本著拋磚引玉思想歡迎大家來一起討論此帖,謝謝!
此帖已經在遠望論壇發帖子討論,已經有人回復總結一文,在此一起發出,希望更多的人針對此發表自己的見解

針對ASP中SQL Injection的初級防護(總結版)
robur/文

記得大約是在2002年的時候,SQL Injection(SQL注入)開始有了最初的雛形。黑客們發現,在動態網頁的某些地方(表單等……)插入一些可以在資料庫查詢中起作用的語句和符號,就可以讓網網頁面執行後,返回特殊的結果。於是,經過了2003的發展,到2004年,SQL Injection已經作為一種很成熟的入侵技術登上了安全界的舞台。也是2004年,有大批的網站程式被發現了SQL Injection漏洞,也有大批的網站栽倒在這種攻擊手段之下。
下面,我就小行和逍遙一指令的帖子,作總結性的說明,僅供參考。
正如如小行所說的,在某些網站的登入界面,如果你知道了存在的用戶名(例如:admin),你無須知道密碼。只需在密碼框中輸入' or ''='即可。(注意,全是單引號!)這樣在不知道密碼的情況下,也可以用admin的身份登入。
但是,我想說的是,' or ''='在一些地方會出現問題。有些資料庫不會認為「空」=「空」是成立的條件,這樣就不行了。最好寫成' or '1'='1
這樣,SQL的查詢語句,就變成了如下的樣子。
select * from users where name='admin' and pass='123456' or '1'='1'
上面,藍色的部分是用戶在密碼框中輸入的資料。大家可以看見,由於用戶的巧妙構造,使得SQL Server把這條查詢語句解析為3個條件:
1、name='admin'
2、pass='123456'
3、'1'='1'
關鍵是中間的那個or,這樣一來,SQL Server在解析的時候,只要條件2、3,符合一個就可以了。
因為1=1是衡成立的,所以這個查詢的結果肯定是true。

既然已經知道了原理,那我們可以試著防範這種攻擊。
我們的根本目標,就是把用戶輸入的單引號和or過濾掉,這樣就能在基本上杜絕SQL Injection攻擊。但是,需要強調的是,SQL語句中,起作用的還有and,分號,--(兩個減號)等等。

解釋一下:and用於連接兩個條件。;(分號)用於分隔兩個語句。(如果把兩個語句寫在一行,就需要它。)--(雙減號只在MS SQL Server中起作用,含義是忽略後面的內容。這個通常在繁瑣的MS SQL注入中使用。)

回歸主題。asp中為我們提供的字元轉義函數:Replace。看代碼:

<%
Dim Usr,Pwd
Usr=Request.form("username") '從表單獲得資料
Pwd=Request.form("password") '同上
if (Usr<>"") and (Pwd<>"") then '判斷資料為非空
Usr=Replace(Replace(Usr,"'",""),"or","") '嵌套了兩個replace函數,過濾特殊字元
Pwd=Replace(Replace(Pwd,"'",""),"or","")
end if
%>

Repalce語法規則:
Replace(變數名稱,"要過濾的字元","要替換的字元")
說明,「要替換的字元」那裡,如果留空,就是把要過濾的字元直接刪除。
例子:
Replace(Pwd,"'or","")
過濾Pwd變數中的or字元。
由於Replace函數,一次只能對一組字元進行轉義,所以講講Replace的嵌套:
Replace(Replace(Pwd,"or",""),"'","")
代碼中紅色的地方,被外面的replace函數看作一個變數,依此類推。
如果你還想過濾and,分號,--什麼的,請看下面(完全過濾了在SQL注入中最關鍵的5個字元串。)
Replace(Replace(Replace(Replace(Replace(變數名稱,"'",""),"or",""),"and",""),"--",""),";","")

上面只是防範從表單提交的資料,對於一些新聞系統,經常會出現諸如:
http://host/news/show.asp?id=1
之類的URL。
如果在那個1後面,加上一個單引號,一樣會報錯。我們往下看。
如果加上了單引號,SQL語句就變成了:
select * from news where id='1''
因為最後一個引號沒有閉合,所以系統一定會報錯。
防範如下(其實和上面的原理是一樣D……)看代碼:

<%
Dim id
id=Request("id")
if Not IsNumeric(id) then '------事先聲明了變數,所以可以直接寫進去。否則,就要寫Request("id")
Response.write "Error!" '------反饋錯誤訊息
Response.end '------中止執行下面的語句
end if
%>

因為,類似新聞ID之類的變數,是根本不需要有字母和符號存在的,所以用IsNumeric來判斷是否為純數位,確保萬無一失。
如果一個變數,裡面需要有字母和符號,那你就只好用Replace函數慢慢過濾了……:O)

最後,再說兩種防止ASP網網頁面暴出錯誤訊息的方法。
眾所周知,入侵者往往都是通過網網頁面暴出的錯誤來得知一些額外的訊息。比如你的系統,SQL Server的版本,是否存在某資料庫,SQL語句是否執行成功等……
防止入侵者看到錯誤訊息,就是讓入侵者變成了睜眼瞎,找不到頭緒。(骨灰級黑客除外~~~~)
方法1:打開你的IIS管理器(以IIS6.0為例),選擇你的網站=》內容網網頁面=》主目錄選擇項=》點擊配置按鍵=》除錯選擇項=》向客戶端發送下列文本錯誤消息
這樣,即使入侵者找到了注入點,注入後,得到也只是服務器返回的固定的錯誤消息。不能得到任何有價值的錯誤訊息。

方法2:在你的ASP語句中(一般是在最開頭的地方),加上一句
On Error Resume Next
(注意,這句必須加在<% %>裡面,不然IIS可不認。)
這就是著名的容錯語句,當ASP語句執行時發生錯誤,就跳過錯誤,繼續向下執行,而且不會返回錯誤訊息。
當然,入侵者看不到錯誤訊息,除錯人員也看不到。所以,你一定在把一個ASP程式除錯完畢後,再把這個語句加到ASP語句的頂端。否則,除錯的時候,會煩死你的~~~~~~:O)
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 2 位會員向 psac 送花:
kmvsld (2009-02-27),wulihua (2006-11-01)
感謝您發表一篇好文章