任長普
(克拉瑪依市委黨校電大 新疆 克拉瑪依 834000)
目前至少有70%以上的Web站點存在著SQL注入的缺陷,惡意用戶便可以利用服務器、數據庫配置的疏漏和精心構造的非法語句通過程序或腳本侵入服務器獲得網站管理員的權限和數據庫的相關內容,嚴重的還可以獲得整個服務器所在內網的系統信息,它們的存在不僅對數據庫信息造成威脅,甚至還可以威脅到系統和用戶本身。SQL注入攻擊是腳本攻擊的一種,文中將從分析SQL注入PHP網站開始,介紹SQL注入的基本思路與方法,結合實例分析多種SQL注入方式,并整理總結了網站防范SQL注入的手段。
網站安全技術除了以上所述外,另外最重要同時也應用最廣泛的就是SQL注入技術,也是文中所研究的重點,將在下文作詳細地介紹和探討。
所謂SQL注入式攻擊,也就是SQL Injection,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。來自官方的說法是:“當應用程序使用輸入內容來構造動態SQL語句以訪問數據庫時,會發生SQL注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞,也會發生SQL注入攻擊。SQL注入可能導致攻擊者能夠使用應用程序登錄在數據庫中執行命令。如果應用程序使用特權過高的帳戶連接到數據庫,這種問題會變得很嚴重”。
在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。而許多網站程序在編寫時,沒有對用戶輸入數據的合法性進行判斷或者程序中本身的變量處理不當,使應用程序存在安全隱患。
這樣用戶就可以提交一段數據庫查詢代碼,(一般是在瀏覽器地址欄進行,通過正常的www端口訪問)根據程序返回的結果,獲得一些敏感的信息或者控制整個服務器,于是SQL注入產生了。其實簡單點說,SQL注入的原理就是從客戶端提交特殊的代碼,收集程序及服務器的信息,從而獲取你想到得到的資料[3-4]。
Access:asc(字符)SQLServer:unicode(字符);
作用:返回某字符的ASCII碼;
Access:chr(數字)SQLServer:nchar(數字);
作用:與asc相反,根據ASCII碼返回字符;
Access:mid(字符串,N,L)SQLServer:substring(字符串,N,L);
作用:返回字符串從N個字符起長度為L的子字符串,即N到N+L之間的字符串;
Access:abc(數字)SQLServer:abc(數字);
作用:返回數字的絕對值(在猜解漢字的時候會用到);
Access:A between B And C SQLServer:A between B And C;
作用:判斷A是否界于B與C之間。
SQL Server與MySQL都是Web應用開發的后端服務器,通過服務器來進行系統文件與命令的操作是攻擊者最常用的手段,攻擊者多數是分析利用它們網絡通信機制來進行版本信息探測和漏洞掃描,掃描到的數據可以清楚的協助攻擊者掌握后臺版本漏洞并做出相應的注入攻擊策略。
1)SQL Server通信方式 命名管道通信,是借助SMB報文來進行的,如果服務器端配置有加載命名管道網絡庫,它就會使用TCPl39及445端口來完成與客戶端的通信。客戶端如果配置了命名管道來連接服務器,一般是與端口445端口建立SMB的會話連接。
TCP/IP協議通信,此種通信需要客戶端和服務器端都加載有TCP/IP網絡庫,SQL Server會在TCPl433端口監聽客戶端的連接請求。
多協議通信,這是一種采用Windows RPC的通信機制。SQL Server會在初始化時向TCPl35端口上的Mapper服務動態注冊監聽端口,而客戶端要連接SQLServer需向TCPl35端口的Mapper發送請求,在得到真正的端口后才能正常通信。
2)MySQL通信方式 TCP/IP協議通信,MySQL缺省監聽的TCP端口是3306,服務器會通過這個端口與客戶端進行數據通信。熟悉各自數據庫服務器的通信方式會對網絡掃描有一定的針對性和目的性。
Web表單數據提交方式有兩種,一種是GET,一種是PoST。GET提交數據是利用URL傳值,提交的數據顯示在網頁地址URL中,一般可以看到,且網頁地址欄可以讓客戶端用戶隨意輸入。GET提交方式受到限制,最多只能提交1 024字節的數據,而POST提交不受到限制。POST提交的數據從URL地址欄上是無法看到的。
問號后面就是屬于URL傳值。有時候會有多個參數,這些值用戶可以看到,也可以更改,就算網站不允許用戶與網站進行交互,用戶也可以隨意修改URL地址。如果你允許用戶與網站交互,那么用戶還可以通過表單提交數據到服務器。用戶可以隨意在URL地址中或是表單書寫作何東西,就容易被別有用心的人加以利用,在入侵網站的手段中,SQL注入成了大多攻擊者嘗試入侵的方法。SQL注入,是指利于SQL語法特性,從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取你想到得到的資料。
GET能提交1 024字節的數據也足夠應付攻擊者的要求。SQL注入是基于應用層的,這種攻擊方式是攻擊者通過猜測一些公共表來進行攻擊的,這種攻擊方式得以實施的前提是因為攻擊者熟程序設計人員的編程習慣和程序設計的特點。普通用戶會認為非公開下載的源程序,攻擊者是很難得到真實數據庫結構,但事實上數據庫中有用戶表與系統表,一般程序員會對系統表名為sysobjects,系統表存在的每一個對象,包括約束、默認值、日志等等,攻擊者可以在查詢分析器時執行相對應的SQL語句就可以依次得到數據庫的用戶表,從而得到數據庫表中的字段。
服務器的安全措施雖然不能有效阻止SQL的注入,但可以將降低SQL注入的威脅,防范某些機密數據的泄露,如果服務器的安全系數不夠,黑客可能就直接滲透服務器,不必在網頁上大費周折。有些小型網站是采用ASP+ACCESS或是PHP+ACCESS創建的,如果ACCESS存在的文件夾允許訪問,而數據后綴為mdb,則網站瀏覽者可以直接下載該數據庫。服務器的安全措施適用于擁有獨立服務器的網站。
1)Apache服務器安全 修改掉默認的用戶名,修改用戶名權限,只有管理員才擁有最高權限,關才所有的不需要的端口。及時的對服務器進行更新,安裝最近補丁,提高服務器安全。把一般性需要保護的文件放在安全目錄下,禁止非法用戶的訪問。
2)IIS服務器安全 屏蔽錯誤信息是在服務處理完畢后進行補救。攻擊其實已經發生,只是企圖阻擊攻擊者知道攻擊結果。一些攻擊者使用新技術,在錯誤信息被屏蔽的情況下仍能獲得錯誤信息。按需求限制網站或文件夾的權限,包括腳本資源訪問、讀取、寫入、目錄瀏覽、記錄訪問、索引資源等等。如果網站不需要與用戶進行交互,那可以去掉寫入權限。如果網站只限內部人員使用,可以去掉匿名訪問權限,選擇集成Windows身份驗證。刪掉不必要的腳本映射,刪除IIS的危險組件。
3)Access數據庫安全 Access數據庫以獨立的文件存在于文件夾中,這與MySQL及MsSQL不同,Access應在獨立的文件夾內,該文件夾內不能包含有網站的當前路徑,網站瀏覽無法在瀏覽器的地址欄內輸入地址訪問文件夾,access的擴展名不要以mdb為后綴,可改為.asp,或是.asa。
4)MySQL數據庫安全 更改默認的用戶名與密碼。限制用戶權限,根據不同的用戶分配查詢、插入、更新、刪除等操作權限,例如僅允許用戶具有查詢權限,則用SQL注入想要進行插入、更新、刪除等操作時無法使用。
5)MsSQL數據庫安全 限制使用數據庫的權限,不要賦予使用數據庫用戶角色為服務器角色組,根據需要分配表的操作權限。
6)PHP安全 將 magic_quotes_gpc設置為 on,對輸入的特殊字符進行轉義。將display_errorsy設置為on,禁止錯誤信息提示,防止惡意用戶從錯誤提示中得到提示。
SQL注入,大多都從客戶端滲透的。客戶端的SQL注入,屬于正常提交,服務器允許客戶端向服務器提交數據,開發人員對于來自客戶端的提交的數據,要假設都是不可信任的,在服務器正式處理之前,對來自客戶端提交的數據進行驗證、過濾。
1)addslashes()函數 PHP函數,將對輸入的特殊字符進行轉義,如果服務器magic_quotes_gpc設置為on,會自動對輸入的特殊字符進行轉義。
2)server.HTMLEncode()函數 ASP 函數,對指定的字符串應用HTML編碼,(把字符編碼為轉義符),瀏覽器在解釋轉義符時,只將轉義符對應的字符或者字符串轉化顯示在瀏覽器上,而不進行HTML的標記解釋,類似PHP的addslashes()函數,但沒有它強大,例如說單引號,server.HTMLEncode0函數就不會對它進行轉義,而單引號在SQL注入的作用非常的大。
3)MD5()函數 PHP中有自帶函數,對指定的字符串進行加密。ASP中需要自定義,網絡中很容易找到,自定義函數已有自己的好處,可以根據需要進行某些更改,雖說該函數加密不可逆,但網上很容易搜到破解工具,如果你做一些更改,網上的工具就無法破解了。
4)intval()函數 PHP函數,通過使用特定的進制轉換(默認是十進制),返回變量腳的integer數值,如果查詢的是整形變量,利用此函數將用戶的輸入轉換成整形,該函數與settype(mixed var,‘int’)功能差不多。
5)isnumeric()、is_numeric()函數 分別為 ASP、PHP 函數,判斷變量是否為數字。當限制客戶端的輸入為數字時,可以用來加以判斷。
6)len()函數與 strlen()函數 兩個函數分別為 ASP、PHP獲取長度的函數,用此函數限制用戶輸入數據的長度。
7)正則配匹 正則匹配能將復雜的驗證簡化成較短的判斷語句,例如它可以驗證輸入數據的長度,是否為數字等,用一個表達式就可以完成,不必分開驗證,唯一的缺點是,相對函數來說,正則匹配驗證時間會比一般函數要慢。
文中對SQL注入攻擊的方法、原理以及攻擊實施過程進行了闡述和總結,由于SQL注入攻擊是針對應用開發過程中的編程漏洞,因此對于絕大多數防火墻來說,這種攻擊是可以繞過的。雖然數據庫服務器的版本一直在更新,各種腳本語言本身的漏洞也越來越少,可是隨著SQL注入技術的不斷提高,只要Web應用系統或源碼中仍然存在此類漏洞,就會潛伏著這種隱患。本文總結整理出多種SQL注入方式,并結合實例提出多種有效的防范SQL注入的方法,且穩定安全地運用于實際網站當中,為WEB網站保駕護航。
[1]胡昌振.網絡入侵檢測原理與技術[M].北京:北京理工大學出版社,2006.
[2]鄧吉,曹軼,羅詩堯.黑客攻防實戰入門[M].北京:電子工業出版社,2007.
[3]張勇,李力,薛倩.Web環境下SQL注入攻擊的檢測與防御[J].現代電子技術,2004,27(15):103-105.ZHANG Yong,LI li,XUE Qian.Detection and prevention of SQL injection attacksin Web environment[J].Modern electronic technology,2004,27(15):103-105.
[4]王云,郭外萍,陳承歡.Web項目中的SQL注入問題研究與防范方法[J].計算機工程與設計,2010,31(5):976-978.WANG Yun,GUO Wai-ping,CHEN Cheng-huan.SQL injection in the Web project research and prevention methods[J].Computer Engineering and Design,2010,31(5):976-978.
[5]劉文晉.遠程滲透測試中的SQL注入攻擊技術研究[D].北京:北京交通大學,2009.
[6]徐茹枝.針對SQL攻擊的數據庫防護系統的設計與研究[D].上海:華北電力大學,2010.
[7]張駿溫.多功能SQL注入檢測系統的實現及攻擊防范方法研究[D].北京:北京交通大學,2009.
[8]徐寅昊.SQL注入及SQL Server的安全性研究 [D].華東師范大學,2009.
[9]張卓.SQL注入攻擊技術及防范措施研究[D].上海:上海交通大學,2007.
[10]張超.SQL Server數據庫入侵檢測系統的研究[D].西安電子科技大學,2004.
[11]張博.SQL注入攻擊與檢測技術研究[J].信息安全與通信保密,2010(5):90-92.ZHANG Bo.SQL Injection Attack and Detection Technology[J].Information Security and Communications Privacy,2010(5):90-92.
[12]王菊.淺談計算機網絡安全[J].硅谷,2010(5):49.WANG Ju.Talk about computer network security[J].Silicon Valley,2010(5):49.
[13]王曉平.惡意代碼的入侵檢測技術研究[J].哈爾濱職業技術學院報,2010(3):124-125.WANG Xiao-ping.Research on the instruction detect system technology of the malicious code[J].Journal of Harbin Vocational&Technical College,2010(3):124-125.
[14]謝棟梁.淺談SQL注入攻擊與防范[J].中國西部科技,2010(2):20-21.XIE Dong-liang.Talk about the SQL injection attacks and prevention[J].Science and Technology of West China,2010(2):20-21.
[15]王希忠,王智,黃俊強.淺談數據庫注入攻擊及其應對策略[J].信息技術,2010(2):120-124.WANG Xi-zhong,WANG Zhi,HUANG Jun-qiang.Database injection attacks and strategy for coping with it[J].Information Technology,2010(2):120-124.