文章目錄
- 1. SQL注入漏洞攻擊原理
- 2. SQL注入漏洞攻擊的檢測方式及方法
- 3. SQL注入漏洞防範措施
SQL注入(SQLInjection)漏洞攻擊是目前網上最流行最熱門的駭客指令碼攻擊方法之一,那什麼是SQL注入漏洞攻擊呢?它是指駭客利用一些Web應用程式(如:網站、論壇、留言本、文章發布系統等)中某些存在不安全的程式碼或SQL語句不縝密的頁面,精心構造SQL語句,把非法的SQL語句指令轉譯到系統實際SQL語句中並執行它,以擷取使用者名稱、口令等敏感資訊,從而達到控制主機伺服器的攻擊方法。
1. SQL注入漏洞攻擊原理 1. 1 SQL注入漏洞攻擊實現原理
SQL(Structured Query Language)是一種用來和資料庫互動的語言文本。SQL注入的攻擊原理就是攻擊者通過Web應用程式利用SQL語句或字串將非法的資料插入到伺服器端資料庫中,擷取資料庫的系統管理使用者許可權,然後將資料庫系統管理使用者許可權提升至作業系統系統管理使用者許可權,控制伺服器作業系統,擷取重要訊息及機密檔案。
SQL注入漏洞攻擊主要是通過藉助於HDSI、NBSI和Domain等SQL注入漏洞掃描工具掃描出Web頁面中存在的SQL注入漏洞,從而定位SQL注入點,通過執行非法的SQL語句或字串達到入侵者想要的操作。下面以一段身分識別驗證的.NET代碼為例,說明一下SQL 插入式攻擊的實現方法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]);string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'"; DataSet userSet = new DataSet();SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);userAdapter.Fill(userSet, "Users");Session["UserID"] =Txtusername.Text.ToString();Session["type"] =type.Text.ToString();Response.Redirect("/Myweb/admin/login.aspx");
從上面的代碼中可以看出,程式在與資料庫建立串連得到使用者資料之後,直接將username的值通過session傳給login.aspx,沒有進行任何的過濾和處理措施, 直接用來構造SQL 陳述式, 其危險係數是非常高的, 攻擊者只要根據SQL 陳述式的編寫規則就可以繞過身分識別驗證,從而達到入侵的目的。
1. 2 SQL注入漏洞攻擊分析
SQL注入可以說是一種漏洞,也可以說是一種攻擊。當程式中的變數處理不當,沒有對使用者提交的資料類型進行校正,編寫不安全的代碼,構造非法的SQL語句或字串,都可能產生這個漏洞。
例如Web系統有一個login頁面,這個login頁面控制著使用者是否有權訪問,要求使用者輸入一個使用者名稱和口令,串連資料庫的語句為:
“select * from users where username = 'username' andpassword = 'password'”
攻擊者輸入使用者名稱為aa or 1=1口令為1234 or 1=1之類的內容。我們可以看出實際上攻擊者並不知道真正的使用者名稱、口令,該內容提交給伺服器之後,伺服器執行攻擊者構造出的SQL命令,但由於攻擊者輸入的內容非常特殊,所以最後得到的SQL命令變成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”
伺服器執行查詢或預存程序,將使用者輸入的身份資訊和資料庫users表中真實的身份資訊進行核對,由於SQL命令實際上已被修改,存在永遠成立的1=1條件,因此已經不能真正驗證使用者身份,所以系統會錯誤地授權攻擊者訪問。
SQL 注入是通過目標伺服器的80連接埠進行的,是正常的Web訪問,防火牆不會對這種攻擊發出警告或攔截。當Web伺服器以普通使用者的身份訪問資料庫時,利用SQL注入漏洞就可能進行建立、刪除、修改資料庫中所有資料的非法操作。而當資料庫以系統管理使用者許可權的身份進行登入時,就可能控制整個資料庫伺服器。
SQL注入的方法很多,在以手動方式進行攻擊時需要構造各種各樣的SQL語句,所以一般攻擊者需要豐富的經驗和耐心,才能繞過檢測和處理,提交語句,從而獲得想要的有用資訊。這個過程需要花費很多的時間,如果以這種手動方式進行SQL注入漏洞攻擊,許多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等網站就會安全很多了,不是漏洞不存在了,而是手動入侵者需要編程基礎,但現在攻擊者可以利用一些現成的駭客工具來輔助SQL注入漏洞攻擊,加快入侵的速度,使SQL注入變得輕而易舉。
由於SQL注入漏洞攻擊利用的是通用的SQL文法,使得這種攻擊具有廣泛性。理論上說,對於所有基於SQL語言的資料庫管理系統都是有效,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。當然,各種系統自身的SQL擴充功能會有所不同,因此最終的攻擊代碼可能不盡相同。
1. 3 SQL注入漏洞攻擊過程
(1)繞過身分識別驗證
如一個login介面,需要輸入使用者名稱和口令,然後Post到另一個頁面,進行身分識別驗證,因此攻擊者只需在使用者名稱和口令的輸入框中都輸入aa or’1’=’1’的內容,那麼攻擊者就可以通過欺騙的驗證方式而直接進入下一個頁面,並擁有和正常登入使用者一樣的全部特權。原因是什麼呢? 我們比較一下正常使用者登入和攻擊者登入時的兩種SQL語句:
1)正常使用者(如使用者名稱為admin,口令為1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻擊者(使用者名稱和口令都為aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and串連的兩個條件都被一個永遠成立的1=1所代替,執行的結果為true,資料庫會認為條件恒成立,會返回一個true,讓攻擊者以合法身份登入進入下一個頁面。
(2)執行非法操作
如一個查詢頁面select1.asp? id=1,編程人員原本設計意圖是顯示id為1的查詢資訊,而攻擊者利用程式中沒有對id內容進行檢查的機制,插入自己的代碼。
從select1.asp中摘錄一段關鍵代碼:
SQL= " select *from photo where photoid= 'id'";
可以看到,id沒有進行任何的處理,直接構成SQL語句並執行,而攻擊者在知道該系統資料庫中表名及欄位名的情況下,利用SQL語句特性(分號是將兩句SQL 陳述式分開的符號),直接向資料庫Tuser表中添加記錄:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理員'),然後攻擊者就可以直接用hack進行登入了。通過這樣的方法,攻擊者還可以對系統做任何的事情,包括添加、刪除、修改系統資源的操作。
(3)執行系統命令
如果Web主機使用MSSQL資料庫管理系統,那麼攻擊者就可以用到xp_cmdshell這個擴充預存程序,xp_cmdshell是一個非常有用的擴充預存程序,用於執行系統命令,比如dir、net等,攻擊者可以根據程式的不同,提交不同的語句:
execmaster.dbo.xp_cmdshell " dir ";exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
這樣就可以向Web主機系統中成功添加了一個系統管理員帳戶。
2. SQL注入漏洞攻擊的檢測方式及方法 2. 1檢測方式
SQL注入漏洞攻擊檢測分為入侵前的檢測和入侵後的檢測。入侵前的檢測,可以通過手工方式,也可以使用SQL注入漏洞掃描工具軟體。檢測的目的是為預防SQL注入漏洞攻擊,而對於SQL注入漏洞攻擊後的檢測,主要是針對審計日誌的查看,SQL注入漏洞攻擊成功後,會在Web Service和資料庫的審計日誌中留下“痕迹”。
2. 2檢測方法
(1)動態SQL檢查
動態SQL語句是一個進行資料庫查詢的強大的工具,但把它和使用者輸入混合在一起就使SQL注入成為了可能。將動態SQL語句替換成先行編譯的SQL或者預存程序對大多數應用程式是可行的。先行編譯的SQL或者預存程序可以將使用者的輸入作為參數而不是命令來執行,這樣就限制了入侵者的行動。當然,它不適用於預存程序中利用使用者輸入來產生SQL命令的情況。在這種情況下,使用者輸入的SQL命令仍可能得到執行,資料庫仍然存在SQL注入漏洞攻擊的危險。
(2)有效性校正
如果一個輸入框只可能包括數字,那麼要通過驗證確保使用者輸入的都是數字。如果可以接受字母,檢查是不是存在不可接受的字元,那就需要設定字串檢查功能。確保應用程式要檢查以下字元:分號、等號、破折號、括弧以及SQL關鍵字。
(3)資料表檢查
使用SQL注入漏洞攻擊工具軟體進行SQL注入漏洞攻擊後,都會在資料庫中產生一些暫存資料表。通過查看資料庫中最近建立的表的結構和內容,可以判斷是否曾經發生過SQL注入漏洞攻擊。
(4)審計日誌檢查
在Web伺服器中如果啟用了審計日誌功能,則Web Service審計日誌會記錄訪問者的IP地址、訪問時間、訪問檔案等資訊,SQL注入漏洞攻擊往往會大量訪問某一個分頁檔(存在SQL注入點的動態網頁),審計記錄檔會急劇增加,通過查看審計記錄檔的大小以及審計記錄檔中的內容,可以判斷是否發生過SQL注入漏洞攻擊事件;另外還可以通過查看Database Audit日誌,查詢某個時間段是否有非法的插入、修改、刪除操作。
(5)其他
SQL注入漏洞攻擊成功後,入侵者往往會添加特權使用者(如:administrator、root、sa等)、開放非法的遠程服務以及安裝木馬後門程式等,可以通過查看使用者帳戶列表、遠程服務開啟情況、系統最近日期產生的一些檔案等資訊來判斷是否發生過入侵。
3. SQL注入漏洞防範措施
SQL注入漏洞攻擊的防範方法有很多種,現階段總結起來有以下方法:
(1)資料有效性校正。如果一個輸入框只可能包括數字,那麼要通過校正確保使用者輸入的都是數字。如果可以接受字母,那就要檢查是不是存在不可接受的字元,最好的方法是增加字元複雜度自動驗證功能。確保應用程式要檢查以下字元:分號、等號、破折號、括弧以及SQL關鍵字。另外限制表單資料輸入和查詢字串輸入的長度也是一個好方法。如果使用者的登入名稱最多隻有10個字元,那麼不要認可表單中輸入10個以上的字元,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝資料資訊。對用戶端提交的資料進行封裝,不要將資料直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者擷取cookie中的重要訊息。
(3)去除代碼中的敏感資訊。將在代碼中存在的使用者名稱、口令資訊等敏感欄位刪除,替換成輸入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:這樣顯然會暴露管理員的使用者名稱、口令資訊。可以將其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會輕易的就擷取到使用者名稱、口令資訊。
(4)替換或刪除單引號。使用雙引號替換掉所有使用者輸入的單引號,這個簡單的預防措施將在很大程度上預防SQL注入漏洞攻擊,單引號時常會無法約束插入資料的Value,可能給予輸入者不必要的許可權。用雙引號替換掉單引號可以使大部分SQL注入漏洞攻擊失敗。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
顯然會得到與
“select * from users where username='admin' and password= '1234567'”
相同的結果。
(5)指定錯誤返回頁面。攻擊者有時從用戶端嘗試提交有害代碼和攻擊字串,根據Web Service給出的錯誤提示資訊來收集程式及伺服器的資訊,從而擷取想得到的資料。應在Web Service中指定一個不包含任何資訊的錯誤提示頁面。
(6)限制SQL字串串連的設定檔。使用SQL變數,因為變數不是可以執行的指令碼,即在Web頁面中將串連資料庫的SQL字串替換成指定的Value,然後將Web.config檔案進行加密,拒絕訪問。
(7)設定Web目錄的存取權限。將虛擬網站的檔案目錄禁止遊客使用者(如:Guest使用者等)訪問,將User使用者權限修改成唯讀許可權,切勿將系統管理權限的使用者添加到訪問列表。
(8)最小服務原則。Web伺服器應以最小許可權進行配置,只提供Web服務,這樣可以有效地阻止系統的危險命令,如ftp、cmd、vbscript等。
(9)鑒別資訊加密儲存。將儲存在資料庫users表中的使用者名稱、口令資訊以密文形式儲存,也可以對users表進行加密處理,這樣可以大大增加對鑒別資訊訪問的安全層級。
(10)使用者權限分離。應儘可能的禁止或刪除資料庫中sa許可權使用者的訪問,對不同的資料庫劃分不同的使用者權限,這樣不同的使用者只能對授權給自己的資料庫執行查詢、插入、更新、刪除操作,就可以防止不同使用者對非授權的資料庫進行訪問。
4. 結束語
SQL注入漏洞攻擊在網上非常普遍,許多ASP、PHP論壇和文章管理系統、下載系統以及新聞系統都存在這個漏洞。造成SQL注入漏洞攻擊的主要原因是開發人員在系統開發的過程中編程不規範,沒有形成良好的編程習慣,問題的解決只有依賴於規範編程。此外,也可以使用現有的SQL注入漏洞掃描器對整個網站中的關鍵代碼進行掃描,尋找網站頁面中存在的SQL注入點。對於有問題的頁面,可以及時刪除或更新。本文通過對SQL注入漏洞攻擊的方法、原理以及攻擊實施過程進行了闡述和總結,並給出了一些常見的SQL注入漏洞攻擊防範的方法。
【注】轉寄自:http://fatedgar.iteye.com/blog/1281836