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伺服器進行攻擊的方法。簡單的說就是在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注入攻擊者在H1TIP請求中輸入含有惡意構造的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等。
sql注入
sql注入