防範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.Cooki es 和 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 的身份訪問資料庫。 記住,給它的許可權越少,你的網站越安全! 你還可以考慮分別給每個需要訪問資料庫的物件分配只擁有必需許可權的帳號,以分散安全性漏洞。 例如:同是前端使用者介面,當用於公共場所時就比用於具有本地內容管理機制的平臺時更加需要嚴格限制資料庫存取權限。 相關資料 在 Internet 上有許許多多關於本話題的有用資源。 我想下列連接可能會對你有所説明: * SQL Injection FAQ HTTP://www.sqlsecurity.com/) * Advanced SQL Injection White Paper HTTP://www.nextgens s.com/research.html) * Preventing SQL Injection HTTP://www.owasp.org/asac/input_validation/sql.shtml) * Designing Secure Web-Based Applications for Microsoft Windows 2000 HTTP://www.amazon.com/exec/obidos/A...guysfromrollaco), 此書值得一看。 責任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001 給力(0票)動心(0票)廢話(0票)專業(0票)標題党(0票)路過(0票) 原文:防範SQL指令植入式攻擊 返回網路安全首頁