測試SQL注入漏洞

SQL注入攻擊對依賴數據庫後端生成動態內容的Web應用程序構成巨大風險。 在這種類型的攻擊中,黑客操縱Web應用程序,試圖將他們自己的SQL命令注入數據庫發出的命令。 有關示例,請參閱文章SQL注入數據庫攻擊。 在本文中,我們來看看幾種測試Web應用程序的方法,以確定它們是否容易受到SQL注入攻擊。

自動SQL注入掃描

一種可能性是使用自動Web應用程序漏洞掃描程序,如HP的WebInspect,IBM的AppScan或Cenzic的Hailstorm。 這些工具都提供了簡單的自動化方法來分析您的Web應用程序,以發現潛在的SQL注入漏洞。 但是,它們非常昂貴,每個座位的價格高達25,000美元。

手動SQL注入測試

什麼是糟糕的應用程序開發人員要做的? 實際上,您可以運行一些基本測試來僅使用Web瀏覽器評估Web應用程序的SQL注入漏洞。 首先,請注意:我描述的測試僅查找基本的SQL注入缺陷。 他們不會檢測到先進的技術,並且使用起來有些繁瑣。 如果您可以負擔得起,請使用自動掃描儀。 但是,如果你無法處理這個價格標籤,手動測試是一個很好的第一步。

評估應用程序是否易受攻擊的最簡單方法是嘗試無害的注入攻擊,如果攻擊成功但實際上並不會損害數據庫,但會為您提供證據證明您需要糾正問題。 例如,假設您有一個簡單的Web應用程序,該應用程序在數據庫中查找個人並提供聯繫信息。 該頁面可能使用以下URL格式:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike

我們可以假定這個頁面執行數據庫查找, 使用類似下面的查詢

SELECT phone FROM directory WHERE lastname ='chapple'and firstname ='mike'

讓我們試驗一下。 通過上面的假設,我們可以對測試SQL注入攻擊的URL進行簡單更改:

http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1

如果Web應用程序沒有得到適當的SQL注入保護,它只是將這個虛假的名字插入到它對數據庫執行的SQL語句中,導致:

選擇手機從目錄WHERE lastname ='chapple'和firstname ='mike'AND(從虛假選擇計數(*))> 0或'1'='1'

您會注意到上面的語法與原始URL中的語法稍有不同。 我冒昧地將它們的ASCII編碼變量轉換為ASCII碼,以便更容易地遵循該示例。 例如,%3d是'='字符的URL編碼。 我也為類似的目的添加了一些換行符。

評估結果

當您嘗試使用上面列出的URL加載網頁時,測試會出現。 如果Web應用程序運行良好,則會在將查詢傳遞到數據庫之前從輸入中去除單引號。 這只會導致對包含一堆SQL的名字的人進行奇怪的查找! 您會看到類似於下面的應用程序的錯誤消息:

錯誤:未找到名稱為mike + AND +的用戶(從+假選擇+ count(*)+)+%3e0 + OR + 1%3d1 Chapple!

另一方面,如果應用程序容易受到SQL注入攻擊,它將直接將該語句傳遞給數據庫,從而產生兩種可能性之一。 首先,如果你的服務器有詳細的錯誤消息(你不應該這麼做!),你會看到類似這樣的東西:

Microsoft OLE DB Provider for ODBC驅動程序錯誤'80040e37'[Microsoft] [ODBC SQL Server驅動程序] [SQL Server]無效的對象名稱'假'。 /directory.asp,第13行

另一方面,如果您的Web服務器不顯示詳細的錯誤消息,則會出現更通用的錯誤,例如:

內部服務器錯誤服務器遇到內部錯誤或配置錯誤,無法完成您的請求。 請聯繫服務器管理員,告知錯誤發生的時間以及可能導致錯誤的任何事情。 有關此錯誤的更多信息可能在服務器錯誤日誌中可用。

如果您收到上述兩個錯誤之一,那麼您的應用程序很容易受到SQL注入攻擊! 您可以採取一些措施來保護您的應用程序免受SQL注入攻擊,其中包括: