sql注入

sql注入

程序命令
SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。
    中文名:sql注入 英文名:SqlInject 語言:計算機語言 類型:參數 類别:平台層注入、代碼層注入 屬于:黑客技術 作用:欺騙服務器執行惡意的SQL命令

定義

SQL是操作數據庫數據的結構化查詢語言,網頁的應用數據和後台數據庫中的數據進行交互時會采用SQL。而SQL注入是将Web頁面的原URL、表單域或數據包輸入的參數,修改拼接成SQL語句,傳遞給Web服務器,進而傳給數據庫服務器以執行數據庫命令。如Web應用程序的開發人員對用戶所輸入的數據或cookie等内容不進行過濾或驗證(即存在注入點)就直接傳輸給數據庫,就可能導緻拼接的SQL被執行,獲取對數據庫的信息以及提權,發生SQL注入攻擊。

特點

1、廣泛性

任何一個基于SQL語言的數據庫都可能被攻擊,很多開發人員在編寫Web應用程序時未對從輸入參數、Web表單、cookie等接受到的值進行規範性驗證和檢測,通常會出現SQL注入漏洞。

2、隐蔽性

SQL注入語句一般都嵌入在普通的HTTP請求中,很難與正常語句區分開,所以當前許多防火牆都無法識别予以警告,而且SQL注入變種極多,攻擊者可以調整攻擊的參數,所以使用傳統的方法防禦SQL注入效果非常不理想。

3、危害大

攻擊者通過SQL注入獲取到服務器的庫名、表名、字段名,從而獲取到整個服務器中的數據,對網站用戶的數據安全有極大的威脅。攻擊者也可以通過獲取到的數據,得到後台管理員的密碼,然後對網頁頁面進行惡意篡改。這樣不僅對數據庫信息安全造成嚴重威脅,對整個數據庫系統安全也影響重大。

4、操作方便

互聯網上有很多SQL注入工具,簡單易學,攻擊過程簡單,不需要專業知識也能自如運用。

原理

SQL注入攻擊是通過操作輸入來修改SQL語句,用以達到執行代碼對WEB服務器進行攻擊的方法。簡單的說就是在post/getweb表單、輸入域名或頁面請求的查詢字符串中插入SQL命令,最終使web服務器執行惡意命令的過程。可以通過一個例子簡單說明SQL注入攻擊。假設某網站頁面顯示時URL為http://www.example.com?test=123,此時URL實際向服務器傳遞了值為123的變量test,這表明當前頁面是對數據庫進行動态查詢的結果。由此,我們可以在URL中插入惡意的SQL語句并進行執行。另外,在網站開發過程中,開發人員使用動态字符串構造SQL語句,用來創建所需的應用,這種情況下SQL語句在程序的執行過程中被動态的構造使用,可以根據不同的條件産生不同的SQL語句,比如需要根據不同的要求來查詢數據庫中的字段。這樣的開發過程其實為SQL注入攻擊留下了很多的可乘之機。

危害

但凡使用數據庫開發的應用系統,就可能存在SQL注入攻擊的媒介。自1999年起,SQL注入漏洞就成了常見安全漏洞之一。至今SQL注入漏洞仍然在CVE列表中排前10。

2011年美國國土安全局,Mitre和SANA研究所将SQL注入作為第一危險的安全漏洞。至今,SQL注入仍然是首要的難以修複的安全威脅漏洞(數據庫生産廠商難以通過維護數據庫自身功能或提高數據庫安全策略來防範SQL注入)。

2012年,Barclaycard的一個代表聲稱97%的數據洩露都是由SQL注入引起的。2011年年末和2012年年初,在不到一個月的時間裡,超過百萬的網頁遭受到SQL注入攻擊。2008年見證了由于SQL注入引起的經濟失調。甚至在2010年秋季,聯合國官方網站也遭受SQL注入攻擊。

2014年一個叫“TeamDigi7al”的黑客組織攻擊了美國海軍的一個名為“Smart Web Move”的web應用。此次事件直接造成美國海軍數據庫超過22萬服役人員的個人信息被洩露。而事後,美國海軍動用了超過50萬美元來彌補此次的數據洩密事故。

在日本電話電報公司集團(NTT)發布的2014全球威脅情報的報告中提出了一個驚人的數字——“企業對一次小規模SQL注入攻擊的平均善後開支,通常超過19.6萬美元。”

随着Web安全事件的不斷頻發,我們不得不思考SQL注入攻擊的代價。顯然,SQL注入不是一個過期的安全問題,恰恰相反,它是一種非常容易被使用的攻擊方式,SQL注入并不需要高深的攻擊手段便可以輕易使敏感的數據庫信息被非法浏覽或删除。事實上,由于SQL注入攻擊簡單而又非常高效,高級黑客們已開始采用某些軟件自動搜索web應用程序的SQL漏洞,并利用SQL注入自動化工具來制造僵屍,并建立可自動攻擊的僵屍網絡。

顯然,SQL注入攻擊并不會在短時間内消失,而其所造成影響更是一個刻不容緩、代價不菲的重大威脅,處理一次web應用安全事故幾乎要花掉20萬美元。網絡安全工程師們務必要意識到,研究與防範SQL注入攻擊是必要的,也是首要的安全任務。

注入過程

第一步:SQL注入點探測。探測SQL注入點是關鍵的一步,通過适當的分析應用程序,可以判斷什麼地方存在SQL注入點。通常隻要帶有輸入提交的動态網頁,并且動态網頁訪問數據庫,就可能存在SQL注入漏洞。如果程序員信息安全意識不強,采用動态構造SQL語句訪問數據庫,并且對用戶的輸入未進行有效性驗證,則存在SQL注入漏洞的可能性很大。一般通過頁面的報錯信息來确定是否存在SQL注入漏洞。

第二步:收集後台數據庫信息。不同數據庫的注入方法、函數都不盡相同,因此在注入之前,我們先要判斷一下數據庫的類型。判斷數據庫類型的方法很多,可以輸入特殊字符,如單引号,讓程序返回錯誤信息,我們根據錯誤信息提示進行判斷;還可以使用特定函數來判斷,比如輸入“1 and version()>0”,程序返回正常,說明version()函數被數據庫識别并執行,而version()函數是MySQL特有的函數,因此可以推斷後台數據庫為MySQL。

第三步:猜解用戶名和密碼。數據庫中的表和字段命名一般都是有規律的。通過構造特殊SQL語句在數據庫中依次猜解出表名、字段名、字段數、用戶名和密碼。

第四步:查找Web後台管理入口。WEB後台管理通常不對普通用戶開放,要找到後台管理的登錄網址,可以利用Web目錄掃描工具(如:wwwscan、AWVS)快速搜索到可能的登錄地址,然後逐一嘗試,便可以找到後台管理平台的登錄網址。

第五步:入侵和破壞。一般後台管理具有較高權限和較多的功能,使用前面已破譯的用戶名、密碼成功登錄後台管理平台後,就可以任意進行破壞,比如上傳木馬、篡改網頁、修改和竊取信息等,還可以進一步提權,入侵Web服務器和數據庫服務器。

注入方法

由于編寫程序時未對用戶輸入數據的合理性進行判斷,導緻攻擊者能在SQL Injection的注入點中夾雜代碼進行執行,并通過頁面返回的提示,獲取進行下一步攻擊所需的信息。根據輸入的參數,可将SQL注入方式大緻分為兩類:數字型注入、字符型注入。 

1、數字型注入

當輸入的參數為整型時,如ID、年齡、頁碼等,如果存在注入漏洞,則可以認為是數字型注入。這種數字型注入最多出現在ASP、PHP等弱類型語言中,弱類型語言會自動推導變量類型,例如,參數id=8,PHP會自動推導變量id的數據類型為int類型,那麼id=8 and 1=1,則會推導為string類型,這是弱類型語言的特性。而對于Java、C#這類強類型語言,如果試圖把一個字符串轉換為int類型,則會抛出異常,無法繼續執行。所以,強類型的語言很少存在數字型注入漏洞。

2、字符型注入

當輸入參數為字符串時,稱為字符型。數字型與字符型注入最大的區别在于:數字型不需要單引号閉合,而字符串類型一般要使用單引号來閉合。

攻擊特點

SQL注入攻擊是目前web應用網絡攻擊中最常見的手段之一,安全風險較高,在一定程度上超過緩沖區溢出漏洞,而市場上的防火牆又不能對SQL注入漏洞進行有效的檢測和防範。防火牆為了使正常網絡應用程序訪問服務器端的數據,必須允許從互聯網到Web服務器的正向連接,因此一旦web網絡應用程序存在注入漏洞,攻擊者就可以獲取訪問數據庫的權利進而獲得數據庫所在服務器的訪問權在某些情況下,SQL注入攻擊的風險要高于緩沖區溢出漏洞等所有其他漏洞。SQL注入攻擊普遍存在範圍廣、實現容易、破壞性大等特點。

SQL注入攻擊者在HTTP請求中輸入含有惡意構造且語法合法的SQL語句,隻要應用程序中沒有做嚴格的處理(例如校驗或預拼接),那麼就會出現SQL注入漏洞危險,目前以PHP、Perl、Cold Fusion Management等技術與Oracle、SQLServer、Sybase、DB2等數據管理系統相結合的Web應用程序都發現有SQL注入漏洞。

SQL注入技術公布後不久,互聯網上出現了很多例如教主的HDSI、NBSI、明小子的Domain等SQL注入工具,對那些存在SQL注入的網站以及Web應用程序進行攻擊,很容易就可以獲取其服務器的控制權。

攻擊手法

1、基于布爾的盲注

因為web的頁面返回值都是True或者False,所以布爾盲注就是注入後根據頁面返回值來得到數據庫信息的一種辦法。

2、基于時間的盲注

當布爾型注入沒有結果(頁面顯示正常)的時候,我們很難判斷注入的代碼是否被執行,也可以說到底這個注入點存不存在?這個時候布爾型注入就無法發揮自己的作用了。基于時間的盲注便應運而生,所謂基于時間的盲注,就是我們根據web頁面相應的時間差來判斷該頁面是否存在SQL注入點。

3、聯合查詢注入

使用聯合查詢進行注入的前提是我們要進行注入的頁面必須有顯示位。所謂聯合查詢注入即是使用union合并兩個或多個SELECT語句的結果集,所以兩個及以上的select必須有相同列、且各列的數據類型也都相同。聯合查詢注入可在鍊接最後添加order by 9基于随意數字的注入,根據頁面的返回結果來判斷站點中的字段數目。

4、基于錯誤信息的注入

此方法是在頁面沒有顯示位,但是echo mysql_error();函數輸出了錯誤信息的時候方能使用。優點是注入速度快,缺點是語句較為複雜,而且隻能用limit依次進行猜解。總體來說,報錯注入其實是一種公式化的注入方法,主要用于在頁面中沒有顯示位,但是用echo mysql_error();輸出了錯誤信息時使用。

檢測技術

SQL注入的檢測方式目前主要有兩大類,第一:動态監測,即在系統運行時,通常在系統驗收階段或上線運行階段使用該方法,使用動态監測攻擊對其系統進行掃描,然後依據掃描結果判斷是否存在SQL注入漏洞。第二:靜态檢測,又稱靜态代碼掃描,對代碼做深層次分析。

1、動态檢測

動态監測分為兩類:手工監測以及工具監測。相對于手動監測的高成本以及高漏檢率,在實際生産過程中更偏向于工具監測,但工具監測同樣存在較大的局限性。其原因在于工具是用報文來判斷SQL注入是否生效,然而僅僅通過報文是很難精準地判斷SQL注入是否存在,因此存在較高的誤報率。

2、靜态檢測

靜态檢測的誤報率相對較低,其主要原因在于SQL注入漏洞的代碼特征較為明顯。

(1)使用數據庫交互代碼;

(2)使用字符串拼接方式構造動态SQL語句;

(3)使用未過濾的不可信任數據。

在常規的排查應用系統中是否存在SQL注入漏洞時,由于靜态掃描的代碼特征明顯,誤報率低和直接閱讀相關代碼,工作總量減少的優勢,通常使用靜态掃描。

注入防範措施

SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。

1、分級管理

對用戶進行分級管理,嚴格控制用戶的權限,對于普通用戶,禁止給予數據庫建立、删除、修改等相關權限,隻有系統管理員才具有增、删、改、查的權限。例如上述實例中用戶在查詢語句中加入了drop table。肯定是不能讓其執行的,否則系統的數據庫安全性就無法保障。故而通過權限的設計限制。使得即使惡意攻擊者在數據提交時嵌入了相關攻擊代碼。但因為設置了權限,從而使得代碼不能執行。從而減少SQL注入對數據庫的安全威脅。

2、參數傳值

程序員在書寫SQL語言時,禁止将變量直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變量。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的内容,過濾掉不安全的輸入數據。或者采用參數傳值的方式傳遞輸入變量。這樣可以最大程度防範SQL注入攻擊。

3、基礎過濾與二次過濾

SQL注入攻擊前,入侵者通過修改參數提交“and”等特殊字符,判斷是否存在漏洞,然後通過select、update等各種字符編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,确保數據輸入的安全性,在具體檢查輸入或提交的變量時,對于單引号、雙引号、冒号等字符進行轉換或者過濾,從而有效防止SQL注入。當然危險字符有很多,在獲取用戶輸入提交的參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以确保系統的安全性。

4、使用安全參數

SQL數據庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer數據庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊。從而确保系統的安全性。

SQLServer數據庫提供了Parameters集合,它在數據庫中的功能是對數據進行類型檢查和長度驗證,當程序員在程序設計時加入了Parameters集合,系統會自動過濾掉用戶輸入中的執行代碼,識别其為字符值。如果用戶輸入中含有惡意的代碼,數據庫在進行檢查時也能夠将其過濾掉。同時Parameters集合還能進行強制執行檢查。一旦檢查值超出範圍。系統就會出現異常報錯,同時将信息發送系統管理員,方便管理員做出相應的防範措施。

5、漏洞掃描

為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以通過采購一些專門系統的SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。雖然漏洞掃描工具隻能掃描到SQL注入漏洞,不能防範SQL注入攻擊。但系統管理員可以通過掃描到的安全漏洞,根據不同的情況采取相應的防範措施封堵相應的漏洞,從而把SQL注入攻擊的門給關上,從而确保系統的安全。

6、多層驗證

現在的網站系統功能越來越龐大複雜。為确保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問數據庫,并且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠随意訪問系統。因此在進行多層驗證時,要每個層次相互配合,隻有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。

7、數據庫信息加密

傳統的加解密的方法大緻可以分為三種:

(1)對稱加密:即加密方和解密方都使用相同的加密算法和密鑰,這種方案的密鑰的保存非常關鍵,因為算法是公開的,而密鑰是保密的,一旦密匙洩露,黑客仍然可以輕易解密。常見的對稱加密算法有:AES、DES等。

(2)非對稱加密:即使用不同的密鑰來進行加解密,密鑰被分為公鑰和私鑰,用私鑰加密的數據必須使用公鑰來解密,同樣用公鑰加密的數據必須用對應的私鑰來解密,常見的非對稱加密算法有:RSA等。

(3)不可逆加密:利用哈希算法使數據加密之後無法解密回原數據,這樣的哈希算法常用的有:md5、SHA-1等。

上一篇:根域名服務器

下一篇:邪惡八進制

相關詞條

相關搜索

其它詞條