web漏洞原理 (需要每周更新此篇文章)
SQL註入攻擊簡介
結構化查詢語言SQL是用來和關系數據庫進行交互的文本語言。它允許用戶對數據進行有效的管理,包含了對數據的查詢、操作、定義和控制等幾個方面,例如向數據庫寫入、插入數據,從數據庫讀取數據等。
關系數據庫廣泛應用於網站中,用戶一般通過動態網頁和數據庫間接進行交互。
常見的動態網頁一般都通過形如“http://domain-name/page.asp?arg=value”等帶有參數的URL來訪問。動態網頁可以是asp、php、jsp或perl等類型。一個動態網頁中可以有一個或多個參數,參數類型也可能是整型或字符串型等。
安全性考慮不周的網站應用程序(動態網頁)使得攻擊者能夠構造並提交惡意URL,將特殊構造的SQL語句插入到提交的參數中,在和關系數據庫進行交互時獲得私密信息,或者直接篡改Web數據,這就是所謂的SQL註入攻擊。
方法:
1.沒有正確過濾轉義字符 在用戶的輸入沒有為轉義字符過濾時,就會發生這種形式的註入式攻擊,它會被傳遞給一個SQL語句。這樣就會導致應用程序的終端用戶對數據庫上的語句實施操縱。比方說,下面的這行代碼就會演示這種漏洞: statement := "SELECT * FROM users WHERE name =‘" userName "‘;" 這種代碼的設計目的是將一個特定的用戶從其用戶表中取出,但是,如果用戶名被一個惡意的用戶用一種特定的方式偽造,這個語句所執行的操作可能就不僅僅是代碼的作者所期望的那樣了。例如,將用戶名變量(即username)設置為: a‘ or ‘t‘=‘t,此時原始語句發生了變化: SELECT * FROM users WHERE name = ‘a‘ OR ‘t‘=‘t‘; 如果這種代碼被用於一個認證過程,那麽這個例子就能夠強迫選擇一個合法的用戶名,因為賦值‘t‘=‘t永遠是正確的。 在一些SQL服務器上,如在SQL Server中,任何一個SQL命令都可以通過這種方法被註入,包括執行多個語句。下面語句中的username的值將會導致刪除“users”表,又可以從“data”表中選擇所有的數據(實際上就是透露了每一個用戶的信息)。 a‘;DROP TABLE users; SELECT * FROM data WHERE name LIKE‘% 這就將最終的SQL語句變成下面這個樣子: SELECT * FROM users WHERE name = ‘a‘;DROP TABLE users;SELECT * FROM DATA WHERE name LIKE ‘%‘; 其它的SQL執行不會將執行同樣查詢中的多個命令作為一項安全措施。這會防止攻擊者註入完全獨立的查詢,不過卻不會阻止攻擊者修改查詢。
2.Incorrecttype handling 如果一個用戶提供的字段並非一個強類型,或者沒有實施類型強制,就會發生這種形式的攻擊。當在一個SQL語句中使用一個數字字段時,如果程序員沒有檢查用戶輸入的合法性(是否為數字型)就會發生這種攻擊。例如: statement := "SELECT * FROM data WHERE id = " a_variable ";" 從這個語句可以看出,作者希望a_variable是一個與“id”字段有關的數字。不過,如果終端用戶選擇一個字符串,就繞過了對轉義字符的需要。例如,將a_variable設置為:1;DROP TABLEusers,它會將“users”表從數據庫中刪除,SQL語句變成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users;
3.數據庫服務器中的漏洞 有時,數據庫服務器軟件中也存在著漏洞,如MYSQL服務器中mysql_real_escape_string()函數漏洞。這種漏洞允許一個攻擊者根據錯誤的統一字符編碼執行一次成功的SQL註入式攻擊。
4.盲目SQL註入式攻擊 當一個Web應用程序易於遭受攻擊而其結果對攻擊者卻不見時,就會發生所謂的盲目SQL註入式攻擊。有漏洞的網頁可能並不會顯示數據,而是根據 註入到合法語句中的邏輯語句的結果顯示不同的內容。這種攻擊相當耗時,因為必須為每一個獲得的字節而精心構造一個新的語句。但是一旦漏洞的位置和目標信息的位置被確立以後,一種稱為Absinthe的工具就可以使這種攻擊自動化。
5.條件響應 註意,有一種SQL註入迫使數據庫在一個普通的應用程序屏幕上計算一個邏輯語句的值: SELECT booktitle FROM booklist WHERE bookId = ‘OOk14cd‘AND 1=1 這會導致一個標準的面面,而語句 SELECT booktitle FROM booklist WHERE bookId = ‘OOk14cd‘AND 1=2在頁面易於受到SQL註入式攻擊時,它有可能給出一個不同的結果。如此這般的一次註入將會證明盲目的SQL註入是可能的,它會使攻擊者根據另外一個 表中的某字段內容設計可以評判真偽的語句。
6.條件性差錯 如果WHERE語句為真,這種類型的盲目SQL註入會迫使數據庫評判一個引起錯誤的語句,從而導致一個SQL錯誤。例如: SELECT 1/0 FROM users WHERE username=‘Ralph‘。顯然,如果用戶Ralph存在的話,被零除將導致錯誤。
7.時間延誤 時間延誤是一種盲目的SQL註入,根據所註入的邏輯,它可以導致SQL引擎執行一個長隊列或者是一個時間延誤語句。攻擊者可以衡量頁面加載的時間,從而決定所註入的語句是否為真。 以上僅是對SQL攻擊的粗略分類。但從技術上講,如今的SQL註入攻擊者們在如何找出有漏洞的網站方面更加聰明,也更加全面了。出現了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。我們不妨看看theAsprox Trojan這種木馬,它主要通過一個發布郵件的僵屍網絡來傳播,其整個工作過程可以這樣描述:首先,通過受到控制的主機發送的垃圾郵件將此木馬安裝到電腦上,然後,受到此木馬感染的電腦會下載一段二進制代碼,在其啟動時,它會使用搜索引擎搜索用微軟的 ASP技術建立表單的、有漏洞的網站。搜索的結果就成為SQL註入攻擊的靶子清單。接著,這個木馬會向這些站點發動SQL註入式攻擊,使有些網站受到控制、破壞。訪問這些受到控制和破壞的網站的用戶將會受到欺騙,從另外一個站點下載一段惡意的JavaScript代碼。最後,這段代碼將用戶指引到第三個站點,這裏有更多的惡意軟件,如竊取口令的木馬。 以前,經常有人警告或建議Web應用程序的程序員們對其代碼進行測試並打補丁,雖然SQL註入漏洞被發現和利用的機率並不太高。但近來攻擊者們越來越多地發現並惡意地利用這些漏洞。因此,在部署其軟件之前,開發人員應當更加主動地測試其代碼,並在新的漏洞出現後立即對代碼打補丁。
技術原理
構造巧妙的SQL語句,和網頁提交的內容結合起來進行註入攻擊。
語句 |
說明 |
正常語句:SELECT * FROM user WHERE username = ‘$username‘ AND pwd = ‘$password‘ 註入語句:SELECT * FROM user WHERE username = ‘tom‘/*‘ AND pwd = ‘‘ |
這條語句後面的內容“AND pwd = ‘‘”因為前面出現的“/*”而被數據庫當作是註釋的內容直接忽略掉(MySQL中采用/*作為註釋),這樣攻擊者就可以不提交密碼的內容而直接登錄 |
正常語句:SELECT * FROM user WHERE username = ‘$username‘ AND pwd = ‘$password‘ 註入語句:SELECT * FROM user WHERE username = ‘tom‘ AND pwd = ‘‘ or ‘1=1‘ |
這條語句利用了1=1這個恒等式作為邏輯判斷,使得即使後面的pwd判斷為假,該語句依然能夠得到正確的執行,攻擊者不使用密碼而成功登錄 |
正常語句:UPDATE user SET pwd = ‘$password‘ WHERE username = ‘$username‘ 註入語句:UPDATE user SET pwd = ‘abcd‘,level=‘3‘ WHERE username = ‘tom‘ |
這條語句利用pwd後面的單引號以及後續的WHERE語句,不僅修改了密碼,還通過修改level為3成為高權限用戶 |
正常語句:SELECT * FROM user WHERE username = ‘$username‘ 註入語句:SELECT * FROM user WHERE username = ‘tom‘ AND LEFT(pwd,1)=‘l‘ |
這條語句利用內置函數來判斷字符串中某個位置的字符,如果成功則顯示出用戶ID。這樣反復的嘗試下去,便會得到真正的密碼 |
正常語句:SELECT * FROM user WHERE username = ‘$username‘ AND pwd = ‘$password‘ 註入語句:SELECT * FROM user WHERE username = ‘tom‘ into outfile ‘d:/http root/file001.txt‘/*‘ AND pwd = ‘‘ |
這條語句到相關路徑下去尋找文件,其中的內容就是tom這個用戶的相關信息 |
正常語句:INSERT INTO user VALUES(‘$id‘, ‘$username‘, ‘$password‘, ‘1‘) 註入語句:INSERT INTO user VALUES(‘10‘, ‘tom‘, ‘password‘,‘3‘)/*‘, ‘1‘) |
這條語句新插入了一個ID為10的用戶tom,並將其權限直接設定為最高的3,這種攻擊方式可以用來通過漏洞註冊高權限用戶 |
防禦手段:框架的防禦
1. 根據通用SQL語句特點,對其中的異常字段進行識別
2. 根據網站後臺數據庫的特性,對其中的異常字段進行識別
3. 分析SQL註入掃描工具,阻斷SQL註入掃描工具攻擊探測
4. 分析實際環境中的SQL註入漏洞
web漏洞原理 (需要每周更新此篇文章)