SQL注入攻擊與防禦技術白皮書
關鍵詞:SQL注入,SQL語句,特征識別
摘 要:SQL注入攻擊是一種比較常見的針對數據庫的漏洞攻擊方式。本文對該攻擊的原理和方式,結合示例進行了說明,並介紹了H3C安全產品對於此類漏洞的防禦措施及策略。
縮略語:
縮略語 | 英文全名 | 中文解釋 |
SQL | Structured Query Language | 結構化查詢語言 |
IPS | Intrusion Prevention System | 入侵防護係統 |
URL | Uniform Resource Locator | 統一資源定位符 |
目 錄
結構化查詢語言SQL是用來和關係數據庫進行交互的文本語言。它允許用戶對數據進行有效的管理,包含了對數據的查詢、操作、定義和控製等幾個方麵,例如向數據庫寫入、插入數據,從數據庫讀取數據等。
關係數據庫廣泛應用於網站中,用戶一般通過動態網頁和數據庫間接進行交互。
常見的動態網頁一般都通過形如“http://domain-name/page.asp?arg=value”等帶有參數的URL來訪問。動態網頁可以是asp、php、jsp或perl等類型。一個動態網頁中可以有一個或多個參數,參數類型也可能是整型或字符串型等。
安全性考慮不周的網站應用程序(動態網頁)使得攻擊者能夠構造並提交惡意URL,將特殊構造的SQL語句插入到提交的參數中,在和關係數據庫進行交互時獲得私密信息,或者直接篡改Web數據,這就是所謂的SQL注入攻擊。
SQL注入攻擊的主要方式是構造巧妙的SQL語句,和網頁提交的內容結合起來進行注入攻擊。比較常用的技巧有使用注釋符號、恒等式(如1=1)、使用union語句進行聯合查詢、使用insert或update語句插入或修改數據等。此外還可以利用一些內置函數輔助攻擊,如使用phpinfo函數顯示基本信息,char函數規避單引號等。下麵結合具體例子介紹幾種簡單的構造方法。
在關係數據庫中,數據通常是以表的方式存儲。假設存在一個名為user的表格,包含有id、username、pwd和level四個列,分別表示了用戶ID、用戶名、密碼和權限等級。表1中列舉了幾種簡單的構造方法,其中出現的“$username”和“$password”等字符串為變量名稱。
語句 | 說明 |
正常語句: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,這種攻擊方式可以用來通過漏洞注冊高權限用戶 |
以上給出的攻擊方式是構造SQL語句技巧中較為簡單和常見的方式,這裏給出一個實際網絡中的例子,形象的說明SQL注入攻擊的發生及其危害。
圖1所示的是某開源校友錄網站的界麵。正常情況下,如果在下拉框中選擇某個年份,頁麵會顯示出該年份畢業生的相關信息,此時Web頁麵的地址欄中的URL為:
http://domain-name/Analysis/Project/index.php?act=view&year=2005
實際上,在對年份進行處理的代碼沒有對用戶提交的數據進行有效過濾,導致存在一個SQL注入攻擊漏洞。攻擊者通過構造特殊的SQL語句提交給Web,會使得Web頁麵顯示來自於內部數據庫中的相關內容。這裏模擬攻擊者的做法,在Web的地址欄中提交一個混合了SQL語句的URL。代碼在執行該語句時對提交的變量內容未作合適的判斷,導致SQL注入攻擊得以成功。
假設提交的語句如下:
http://domain-name/Analysis/Project/index.php?act=view&year=2005'%20union%20select%201,1,1,alumniUserName,1,alumniPassword,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20alumni_users%20where%20ID='1
表2對該URL做了詳細的解釋。
表2 URL內容說明
內容 | 說明 |
http://127.0.0.1/Analysis/Project/index.php?act=view&year=2005 | 正常情況下的URL 其中的“year=2005”的部分在代碼中是作為SQL語句查詢條件而執行的。形如“select * from table where year=2005” |
union | 攻擊者添加的內容 使得添加的整個部分都正常執行,而不會在server數據庫中產生錯誤 |
select%201,1,1,alumniUserName,1,alumniPassword,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20alumni_users%20where%20ID='1 | 攻擊者添加的內容 在alumni_users表中提取出密碼信息並顯示 |
%20 | 空格 |
正常情況下返回的頁麵會顯示畢業生的用戶名以及相關信息,而這裏將密碼作為select語句的選擇列,會在返回頁麵中顯示出用戶的密碼。
提交攻擊語句後,頁麵返回的內容如圖2所示。
可以看到,頁麵除了返回用戶的用戶名及電子郵箱地址,還返回了經過加密的密碼信息。
實際上,通過將注入攻擊中的“1”修改為表中相應的列名稱,Web頁麵還會返回表中其他列的內容,這會使得更多的私人信息得以外泄。
從前述的簡介可以看出,隻要是帶有參數的動態網頁,且此網頁訪問了數據庫,就有可能存在SQL注入攻擊,因此SQL注入攻擊潛在的發生概率相對於其他Web攻擊要高很多,危害麵也更廣。其主要危害包括:獲取係統控製權、未經授權狀況下操作數據庫的數據、惡意篡改網頁內容、私自添加係統帳號或數據庫使用者帳號等。
目前基於數據庫的網絡應用越來越多。與此同時,用於搜索SQL注入點的軟件在網絡上隨處可見,攻擊者隻需要具備少量的專業知識就可以利用這些軟件尋找目標進行攻擊。攻擊目標和攻擊者的增加使得SQL注入攻擊在近幾年出現擴大的趨勢。
H3C通過對SQL注入攻擊分析,發現這類攻擊主要采用如下幾種方式:
l 通過一些常用的SQL注入語句,對網站進行SQL注入攻擊。
l 根據Web後台數據庫本身的特點,對網站進行SQL注入攻擊。
l 使用SQL注入掃描工具,對網站進行SQL注入攻擊。
根據上述特點,H3C開發出了一套完整的SQL注入攻擊防禦框架,能夠及時發現各種已經暴露的和潛在的SQL注入攻擊。H3C IPS設備對於SQL注入攻擊的總體防禦框架如圖3所示。
圖3 SQL注入攻擊防禦框架
H3C IPS設備采用基於特征識別的方式識別並阻斷各種攻擊。設備有一個完整的特征庫,並可定期對特征庫進行升級。當網絡流量進入設備後,設備會檢測流量與當前特征庫的攻擊特征是否匹配。如果匹配,則阻斷網絡流量並上報日誌;否則,網絡流量可以順利通過。
根據SQL注入攻擊的特點,H3C IPS特征庫可以從如下幾個方麵對SQL注入攻擊特征進行識別:
攻擊者在進行SQL注入攻擊時,都會在URL中攜帶一些異常字段,如“and 1=1”。通過識別這些異常字段,檢驗網站是否存在SQL注入漏洞、獲取數據庫信息等。
目前,網站中主要使用的數據庫有:MS-SQL、Access、MySQL、Oracle。每個數據庫都有一些係統表,記錄整個數據庫信息。此外,一些數據庫還有一些額外的功能可以導致SQL注入攻擊。如:MS-SQL數據庫可以執行係統命令;MySQL數據庫可以將整個數據庫信息導出到一個文件中;Oracle數據庫可以將數據庫信息反射到任意監聽端口。
通過對上述數據庫的深入分析,根據各個數據庫自身的特點,提取了URL中出現的異常字段,確保攻擊者無法通過數據庫自身攜帶的特性進行SQL注入攻擊。
在實際的攻擊中,攻擊者通常使用SQL注入掃描工具對網站進行自動化掃描,探測網站是否存在可以利用的SQL注入漏洞。H3C通過對知名的SQL注入掃描工具進行分析,研究出了這些工具的行為和方法,阻斷其對網站的掃描探測。
由於網站的開發人員對一些輸入參數沒有進行嚴格檢測,在實際環境中,存在的漏洞也非常多。一些大的知名漏洞發布網站發布了大量的SQL注入漏洞。通過分析、總結這些漏洞,確保攻擊者無法通過已經公布的SQL注入漏洞進行攻擊。
H3C IPS設備的SQL注入攻擊防禦框架有如下幾個優點:
H3C針對SQL語言自身的特點,考慮到已知各種攻擊的基本原理和形態,結合不同數據庫的類型及SQL注入掃描工具,在各個不同漏洞模型之上開發出了通用的、層次化的SQL注入攻擊檢測模型,並融合到特征庫中。這些模型抽象出SQL注入攻擊的一般形態,對主流的攻擊能夠準確識別,構成了一個完整的SQL注入檢測模型,使得模型通用化。
H3C通過模擬真實的網絡環境,進行了大量的攻防測試,並整理、驗證了近幾年公布的SQL注入漏洞攻擊,使用H3C IPS設備可以識別並且阻斷所有這些已公布的攻擊。
在實際攻擊中,攻擊者為了逃避防攻擊設備的檢測,經常對SQL注入攻擊進行變形,如采用URL編碼技術、修改參數等。H3C根據SQL注入漏洞發生的原理、攻擊方式和攻擊目標,對SQL注入攻擊特征進行了擴展。即使攻擊者修改注入參數、格式、語句等內容,相同漏洞原理下各種變形的攻擊同樣能夠被有效阻斷。這使得設備的防禦範圍擴大,防禦的靈活性也顯著增強,極大的減少了漏報情況的出現。
隨著SQL注入攻擊出現的頻率日益增高,其危害有逐步擴展的趨勢。這就對IPS設備在防禦的深度和廣度上提出了更高的要求,不僅要能夠防禦已有的SQL注入攻擊,更要有效的阻止最新出現的、未公布的攻擊。
目前,H3C已經建立起一套完整的攻防試驗環境,可以及時發現潛在的SQL注入漏洞。同時,H3C還在繼續跟蹤最新的SQL注入攻擊技術和工具,及時更新SQL注入攻擊的特征庫,第一時間發布最新的SQL注入應對措施,確保用戶的網絡不受到SQL注入攻擊。
穩定有效的特征庫為SQL注入攻擊的防禦提供了強有力的支撐。在實際的部署中,H3C IPS設備對網絡流量進行分析和識別。如果流量中存在的特征能夠匹配到SQL注入攻擊的防禦策略,則相關流量被阻斷,根據不同的特征類型和嚴重級別上報日誌,以便網絡管理員能夠了解準確的攻擊信息。如果流量沒有匹配到攻擊模型,則允許流量通過,不會妨礙正常的網絡業務,在準確防禦的同時保證了設備的高效運行。
H3C IPS設備SQL注入防禦的典型組網如圖4所示。
圖4 SQL注入防禦典型組網圖
一般情況下,受到攻擊的網站都分為前台應用程序和後台數據庫兩個部分,前者用來和用戶以及數據庫進行交互,後者用來存儲數據。SQL注入攻擊一般就是利用前台應用程序內的漏洞,直接和後台數據庫交互以獲取信息。因此,IPS設備需要部署在網站內部網絡的出口,即前台應用程序之外,以確保數據庫信息的安全。
Copyright ©2009 杭州華三通信技術有限公司 版權所有,保留一切權利。
非經本公司書麵許可,任何單位和個人不得擅自摘抄、複製本文檔內容的部分或全部,並不得以任何形式傳播。
本文檔中的信息可能變動,恕不另行通知。