防範SQL指令植入式攻擊

來源:互聯網
上載者:User
攻擊 什麼是SQL 指令植入式攻擊?
在設計或者維護 Web 網站時,你也許擔心它們會受到某些卑鄙使用者的惡意攻擊。的確,如今的 Web 網站開發人員們針對其網站所在作業系統平台或Web 服務器的安全性而展開的討論實在太多了。不錯,IIS 伺服器的安全性漏洞可能招致惡意攻擊;但你的安全檢查清單不應該僅僅有 IIS 安全性這一條。有些代碼,它們通常是專門為資料驅動(data-driven) 的 Web 網站而設計的,實際上往往同其它 IIS 漏洞一樣存在嚴重的安全隱患。這些潛伏於代碼中的安全隱患就有可能被稱為“SQL 指令植入式攻擊” (SQL injection) 的手段所利用而導致伺服器受到攻擊。
SQL 指令植入式攻擊技術使得攻擊者能夠利用 Web 應用程式中某些疏於防範的輸入機會動態產生特殊的 SQL 指令語句。舉一個常見的例子:
某 Web 網站採用表單來收集訪問者的使用者名稱和密碼以確認他有足夠許可權訪問某些保密資訊,然後該表單被發送到 Web 服務器進行處理。接下來,伺服器端的ASP 指令碼根據表單提供的資訊產生 SQL 指令語句提交到 SQL 伺服器,並通過分析 SQL 伺服器的返回結果來判斷該使用者名稱/密碼組合是否有效。
為了實現這樣的功能,Web 程式員可能會設計兩個頁面:一個 HTML 頁面 (Login.htm) 用於登入,另一個ASP 頁面 (ExecLogin.asp) 用於驗證使用者權限(即向資料庫查詢使用者名稱/密碼組合是否存在)。具體代碼可能象這樣:
Login.htm (HTML 頁面)

<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="txtUsername"><br>
Password: <input type="password" name="txtPassword"><br>
<input type="submit">
</form>

ExecLogin.asp (ASP 頁面)

<%
Dim p_strUsername, p_strPassword, objRS, strSQL

p_strUsername = Request.Form("txtUsername")
p_strPassword = Request.Form("txtPassword")

strSQL = "SELECT * FROM tblUsers " & _
"WHERE Username=''" & p_strUsername & _
"'' and Password=''" & p_strPassword & "''"

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."

If (objRS.EOF) Then
Response.Write "Invalid login."
Else
Response.Write "You are logged in as " & objRS("Username")
End If

Set objRS = Nothing
%>

乍一看,ExecLogin.asp 的代碼似乎沒有任何安全性漏洞,因為使用者如果不給出有效使用者名稱/密碼組合就無法登入。然而,這段代碼偏偏不安全,而且它正是SQL 指令植入式攻擊的理想目標。具體而言,設計者把使用者的輸入直接用於構建SQL 指令,從而使攻擊者能夠自行決定即將被執行的 SQL 指令。例如:攻擊者可能會在表單的使用者名稱或密碼欄中輸入包含“ or ”和“=” 等特殊字元。於是,提交給資料庫的 SQL 指令就可能是:

SELECT * FROM tblUsers WHERE Username='''' or ''''='''' and Password = '''' or ''''=''''

這樣,SQL 伺服器將返回 tblUsers 表格中的所有記錄,而 ASP 指令碼將會因此而誤認為攻擊者的輸入符合 tblUsers 表格中的第一條記錄,從而允許攻擊者以該使用者的名義登入網站。
SQL 指令植入式攻擊還有另一種形式,它發生在 ASP 伺服器根據 querystring 參數動態產生網頁時。這裡有一個例子,此 ASP 頁面從 URL 中提取出 querystring 參數中的 ID 值,然後根據 ID 值動態產生後繼頁面:

<%
Dim p_lngID, objRS, strSQL
p_lngID = Request("ID")

strSQL = "SELECT * FROM tblArticles WHERE ID=" & p_lngID

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."

If (Not objRS.EOF) Then Response.Write objRS("ArticleContent")

Set objRS = Nothing
%>

在一般情況下,此 ASP 指令碼能夠顯示具有特定 ID 值的文章的內容,而 ID 值是由 URL 中的 querystring 參數指定的。例如:當URL為 http://www.example.com/Article.asp?ID=1055 時,ASP 就會根據 ID 為 1055 的文章提供的內容產生頁面。
如同前述登入頁面的例子一樣,此段代碼也向SQL 指令植入式攻擊敞開了大門。某些惡意使用者可能會把 querystring 中的文章 ID 值偷換為“0 or 1=1”等內容(也就是說,把 URL 換成 http://www.example.com/Article.asp?ID=0 or 1=1) 從而誘使 ASP 指令碼產生不安全的 SQL 指令如:

SELECT * FROM tblArticles WHERE ID=0 or 1=1

於是,資料庫將會返回所有文章的內容。
當然了,本例伺服器所受的攻擊不一定會引起什麼嚴重後果。可是,攻擊者卻可能變本加厲,比如用同樣的手段發送 DELETE 等 SQL 指令。這隻需要簡單地修改前述 URL 中的 querystring 參數就可以了!例如:任何人都可以通過 “http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles ” 之類的 URL 來訪問 Web 網站。
SQL 指令植入式攻擊的危害
SQL 指令植入式攻擊可能引起的危害取決於該網站的軟體環境和配置。當 Web 服務器以操作員(dbo)的身份訪問資料庫時,利用SQL 指令植入式攻擊就可能刪除所有表格、建立新表格,等等。當伺服器以超級使用者 (sa) 的身份訪問資料庫時,利用SQL 指令植入式攻擊就可能控制整個 SQL 伺服器;在某些配置下攻擊者甚至可以自行建立使用者帳號以完全操縱資料庫所在的 Windows 伺服器。
杜絕SQL 指令植入式攻擊
杜絕SQL 指令植入式攻擊的第一步就是採用各種安全手段監控來自 ASP request 對象 (Request 、 Request.QueryString 、 Request.Form 、 Request.Cookies 和 Request.ServerVariables) 的使用者輸入,以確保 SQL 指令的可*性。具體的安全手段根據你的 DBMS 而異,下面給出的都是基於 MS SQL Server的例子。
在前述登入頁面的例子中,指令碼期望得到的兩個輸入變數 (txtUserName 和 txtPassword)均為字串類型。無論使用者在哪個參數中插入單引號,他都可能讓資料庫執行單引號中的 SQL 指令。為了杜絕此類SQL 指令植入式攻擊,我們可以藉助 Replace 函數剔除單引號,比如:
p_strUsername = Replace(Request.Form("txtUsername"), "''", "''''")
p_strPassword = Replace(Request.Form("txtPassword"), "''", "''''")
在第二個例子中,指令碼期望的輸入變數是長整型變數 (ID) 。使用者可以通過在 ID 參數中插入特殊字元來運行不安全的 SQL 指令。為了為了杜絕此類SQL 指令植入式攻擊,我們只需要藉助 CLng 函數限制 ID 值為長整型變數,比如:
p_lngID = CLng(Request("ID"))
當使用者試圖在 ID 中包含特殊字元時,CLng 就會產生一個錯誤。
為了進一步減少SQL 指令植入式攻擊的危脅,請務必清除用戶端錯誤資訊文本中的所有技術資料。某些錯誤資訊往往泄露了技術細節,從而讓攻擊者可以看出伺服器的安全性漏洞所在。這裡指的錯誤資訊不但包括應用程式產生的訊息框,還包括來自 IIS 的出錯提示。為此,你可以禁止由 IIS 發送的詳細錯誤資訊,而改用自訂的出錯頁面。(關於建立自訂的出錯頁面的更多資訊,請務必參閱 《Creating Custom ASP Error Pages》。)
最後,為了減輕SQL 指令植入式攻擊的危害,請限制 Web 應用程式所用的資料庫訪問帳號許可權。一般來說,應用程式沒有必要以 dbo 或者 sa 的身份訪問資料庫。記住,給它的許可權越少,你的網站越安全!你還可以考慮分別給每個需要訪問資料庫的對象分配只擁有必



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。