SQL注入原理及必要的防範措施

什麼是SQL注入?
SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的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表單提交或頁面請求的查詢字符串裏最終達到欺騙服務器執行惡意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分爲3類:
1.變量是數字型,SQL語句:
Select * form 表名 where 字段=21 and 注入查詢
2.變量是字符串型,SQL語句:
Select * form 表名 where 字段=‘字符串’
3.搜索時的變量,SQl語句:
Select * form 表名 where 字段 like‘%關鍵字%’
(注入查詢)代表惡意的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、字符型注入
當輸入參數爲字符串時,稱爲字符型。數字型與字符型注入最大的區別在於:數字型不需要單引號閉合,而字符串類型一般要使用單引號來閉合。

【攻擊手法】
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、分級管理
對用戶進行分級管理,嚴格控制用戶的權限,對於普通用戶,禁止給予數據庫建立、刪除、修改等相關權限,只有系統管理員才具有增、刪、改、查的權限。例如上述實例中用戶在查詢語句中加入了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等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章