摘要:計算機網絡的飛速發(fā)展,使得人們對于網絡安全越來越關注。隨著多起SQL注入式攻擊案例的出現(xiàn)。大家已經開始逐步的關心這類問題。該文針對當今的SQL注入式攻擊的特點進行闡述。對大家認清SQL注入式攻擊有一定的參考價值。
關鍵詞:Web應用;SQL;注入式攻擊;Web安全
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2009)14-3587-02
The Analysis of SQL Injection Attacks
LIU Bin
(Panzhihua University, Panzhihua 617000, China)
Abstract: The rapid development of computer networks, making it a growing concern for network security. With the number of cases SQL injection attacks to happen. We have begun to care about these problems step-by-step. for the Features of the current SQL injection attacks, this paper giving us a certain reference value to get to know it.
Key words: Web application; SQL; Injection attacks; Web Security
1 引言
分布式Web應用的飛速發(fā)展使得軟件系統(tǒng)的體系結構在一定程度上由C/S模式偏向于B/S模式,其平臺架構大多采用ASP(.NET)+SQL+IIS的模式。由于程序編寫人員的水平參差不齊,使得很多程序員設計出來的產品存在著各種安全隱患。其中一個常見的安全隱患就是SQL注入式攻擊。本文從SQL注入式攻擊的原理和方法上進行分析,提出防范的一些解決方法,從而在一定程度上幫助大家解決對SQL注入進行攻擊的問題。
2 SQL注入式攻擊簡介
2.1 相關基礎知識
SQL語言是一種用于關系數(shù)據庫的結構化查詢語言。其典型的執(zhí)行語句是query。它可以修改數(shù)據庫結構和操作數(shù)據庫內容。假如攻擊者通過往query中插入一系列的SQL語句來操作數(shù)據寫入到應用程序中去,我們把這種方法定義成SQL注入。SQL注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后將該字符串傳遞到SQLServer進行分析和執(zhí)行。SQL 注入攻擊技術在國際上最早出現(xiàn)于1999年,2002年后,我國開始大量出現(xiàn)此類問題。它有兩種形式,一種是腳本注入式的攻擊,另外一種是惡意用戶輸入用來影響被執(zhí)行的SQL腳本。
2.2 攻擊原理及過程
SQL注入是目前比較常見的針對數(shù)據庫的一種攻擊方式。攻擊者從正常的網頁端口對網頁進行訪問,當遇到網頁需要查詢數(shù)據庫時,通過把一些含有特殊含義的語句綁定到SQL語句中等方式改變用戶的初衷,從而達到攻擊者篡改數(shù)據等非法的目的。
引言中我們已提到,現(xiàn)在的軟件設計平臺架構大多采用ASP(.NET)+SQL+IIS的模式。ASP頁面客戶端和服務器進行數(shù)據交流有兩種方式。一是客戶端向服務器發(fā)送請求所采用的POST方式,其特點是不需要在URL中顯示,且傳輸數(shù)據量較大;另外一個方面是客戶端要從服務器取得數(shù)據所采用的GET方式,它需要在URL中顯示出來,并受到URL長度限制。傳送的數(shù)據量很小。
一般ASP.NET的Web應用都有一個登錄頁面,識別用戶的身份與權限。大部分網站的用戶登錄驗證程序都是采用POST方法提交用戶名和密碼兩個參數(shù),登錄頁面中輸入的內容將直接用來構造動態(tài)的SQL命令,或者直接用作存儲過程的參數(shù),如:
System.Text.StringBuilder query = new System.Text.StringBuilder(
\"SELECT * from Users WHERE login =' '\")
.Append(txtLogin.Text).Append(\"' AND password=' '\")
.Append(txtPassword.Text).Append(\"'\");
如果用戶在輸入內容中輸入有“1=1”之類的內容,則提交給服務器后,服務器構造出的SQL語句為:
Select * from users where login=\"user\" or 1=1and password=\"pwd\"\"or 1=1
我們看看其執(zhí)行情況。由于SQL命令實際上已被注入式攻擊修改,已經不能真正驗證用戶身份,所以系統(tǒng)會錯誤地授權給攻擊者。在SQL語句中,“l(fā)ogin=\"user\" or 1=1”以及“password=\"pwd\"\"or 1=1”均是邏輯“或”的判斷。即兩個條件中任何一個成立,那么表達式成立,而的1=1是肯定成立的。也就是說整個表達式的值始終成立。這樣查詢語句就通過了,從而就可以進入到管理界面。
以上是一個利用POST方法實現(xiàn)攻擊的例子,實際上利用GET方法實現(xiàn)攻擊的應用更加廣泛。例如訪問某網站的地址如下:
http://www.***.com/showdetail.asp?id=2。如果在地址之后加一單引號。則服務器會報錯:
Microsoft JET Database Engine 錯誤 '80040e14'
字符串的語法錯誤在查詢表達式“ID=2”中。
/showdetail.asp,行8
從其報錯信息,我們分析出,
1) 網站使用的是Access數(shù)據庫,通過JET引擎連接數(shù)據庫。
2) 程序沒有判斷客戶端提交的數(shù)據是否符合程序要求。
3) 該SQL語句所查詢的表中有一名為ID的字段。
從以上信息我們可以簡單分析出SQL注入式攻擊的一般過程[3]:
1) 找到SQL注入點的位置。這是進行SQL注入式攻擊的切入點。
2) 判斷后臺數(shù)據庫的類型。不同的數(shù)據庫有不同的攻擊方法,因此攻擊者必須正確判斷出后臺數(shù)據庫的類型。目前常用的數(shù)據庫為ACCESS、SQL-SERVER以及ORACAL。
3) 查看XP_CMDSHELL的可執(zhí)行情況。即:判斷當前連接數(shù)據的帳號是否具有SA權限,且master.dbo.xp_cmdshell擴展存儲過程(調用此存儲過程可以直接使用操作系統(tǒng)的shell)能夠正確執(zhí)行。
4) 找到Web虛擬目錄的位置,上傳ASP木馬。這一步主要是找到放置ASP木馬的位置,進而得到USER權限。然后把木馬放入Web虛擬目錄的Scripts下,遠程客戶通過IE就可執(zhí)行它,進而得到系統(tǒng)的USER權限,實現(xiàn)對系統(tǒng)的初步控制。
5) 獲得管理員權限。
3 SQL注入攻擊防范
在了解了SQL注入式攻擊的原理之后,我們將分析如何對其進行防范。綜合各方面因素,總結如下:
1) 檢查輸入的 SQL 語句內容,過濾敏感字符。比如:', >, <=, !, -, +, *, /, |, 空格等。
2) 加強對用戶輸入的驗證。
這里指檢查用戶輸入的合法性,確信輸入的內容只包含合法的數(shù)據。總體來說,防治SQL注入式攻擊可以采用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數(shù)化語句來傳遞用戶輸入的內容。在SQLServer數(shù)據庫中,有較多的用戶輸入內容驗證工具可以抵制SQL注入式攻擊。協(xié)助管理員管理。
再則,我們可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現(xiàn)對用戶輸入變量的過濾,比如拒絕一些特殊的符號等等。在以上惡意代碼中,只要存儲過程把那個分號過濾掉,那么這個惡意代碼也就沒有用武之地了。在執(zhí)行SQL語句之前,可以通過數(shù)據庫的存儲過程,來拒絕接納一些特殊的符號。
另外,通過測試類型、長度、格式和范圍來驗證用戶輸入,過濾用戶輸入的內容。這些都是防止SQL注入式攻擊的常見并且行之有效的措施。
3) 區(qū)分不同帳戶的權限。分配給不同類型的用戶以不同的權限,可以最大限度的減少注入式攻擊對數(shù)據庫帶來的危害。特別是不要用dbo或者sa賬戶。比如對于普通的終端用戶,因為他們是軟件是使用者,并不牽涉到對數(shù)據庫的設計操作,要使其具有最小的權限。那么即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由于權限的限制,這些代碼也將無法被執(zhí)行。因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
4) 采用加密機制。加密用戶輸入的數(shù)據,然后再將它與數(shù)據庫中保存的數(shù)據比較,這相當于對用戶輸入的數(shù)據進行了“消毒”處理,用戶輸入的數(shù)據不再對數(shù)據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。System.Web.Security.FormsAuthentication類有一個HashPasswordForStoringInConfigFile,非常適合于對輸入數(shù)據進行消毒處理。
5) 使用專業(yè)的漏洞掃描工具。通過使用一些微軟發(fā)布的專業(yè)漏洞掃描工具,可以幫助我們更好的識別哪些地方將是SQL注入式攻擊的著手點。然后程序員再根據其漏洞進行修補完善處理。
6) 定期檢查IIS日志和數(shù)據表。由于攻擊程序是通過URI請求字符串來觸發(fā),管理員們可以定期檢查IIS日志,查看其中的異常請求。如果IIS日志表明服務器可能已經被攻擊,那么下一步就要檢查相應的Web應用所使用到的數(shù)據庫中的表格,并找出附加在文本內容中的