複製鏈接
請複製以下鏈接發送給好友

sql注入

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

sql注入定義

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

sql注入特點

1、廣泛性
任何一個基於SQL語言的數據庫都可能被攻擊,很多開發人員在編寫Web應用程序時未對從輸入參數、Web表單、cookie等接受到的值進行規範性驗證和檢測,通常會出現SQL注入漏洞。 [3] 
2、隱蔽性
SQL注入語句一般都嵌入在普通的HTTP請求中,很難與正常語句區分開,所以當前許多防火牆都無法識別予以警告,而且SQL注入變種極多,攻擊者可以調整攻擊的參數,所以使用傳統的方法防禦SQL注入效果非常不理想。 [3] 
3、危害大
攻擊者通過SQL注入獲取到服務器的庫名、表名、字段名,從而獲取到整個服務器中的數據,對網站用户的數據安全有極大的威脅。攻擊者也可以通過獲取到的數據,得到後台管理員的密碼,然後對網頁頁面進行惡意篡改。這樣不僅對數據庫信息安全造成嚴重威脅,對整個數據庫系統安全也影響重大。 [3] 
4、操作方便
互聯網上有很多SQL注入工具,簡單易學,攻擊過程簡單,不需要專業知識也能自如運用。 [3] 

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注入攻擊留下了很多的可乘之機。 [4] 

sql注入危害

但凡使用數據庫開發的應用系統,就可能存在SQL注入攻擊的媒介。自1999年起,SQL注入漏洞就成了常見安全漏洞之一。至今SQL注入漏洞仍然在CVE列表中排前10。 [5] 
2011年美國國土安全局,Mitre和SANA研究所將SQL注入作為第一危險的安全漏洞。至今,SQL注入仍然是首要的難以修復的安全威脅漏洞(數據庫生產廠商難以通過維護數據庫自身功能或提高數據庫安全策略來防範SQL注入)。 [5] 
2012年,Barclaycard的一個代表聲稱97%的數據泄露都是由SQL注入引起的。2011年年末和2012年年初,在不到一個月的時間裏,超過百萬的網頁遭受到SQL注入攻擊。2008年見證了由於SQL注入引起的經濟失調。甚至在2010年秋季,聯合國官方網站也遭受SQL注入攻擊。 [5] 
2014年一個叫“TeamDigi7al”的黑客組織攻擊了美國海軍的一個名為“Smart Web Move”的web應用。此次事件直接造成美國海軍數據庫超過22萬服役人員的個人信息被泄露。而事後,美國海軍動用了超過50萬美元來彌補此次的數據泄密事故。 [5] 
在日本電話電報公司集團(NTT)發佈的2014全球威脅情報的報告中提出了一個驚人的數字——“企業對一次小規模SQL注入攻擊的平均善後開支,通常超過19.6萬美元。” [5] 
隨着Web安全事件的不斷頻發,我們不得不思考SQL注入攻擊的代價。顯然,SQL注入不是一個過期的安全問題,恰恰相反,它是一種非常容易被使用的攻擊方式,SQL注入並不需要高深的攻擊手段便可以輕易使敏感的數據庫信息被非法瀏覽或刪除。事實上,由於SQL注入攻擊簡單而又非常高效,高級黑客們已開始採用某些軟件自動搜索web應用程序的SQL漏洞,並利用SQL注入自動化工具來製造殭屍,並建立可自動攻擊的殭屍網絡。 [5] 
顯然,SQL注入攻擊並不會在短時間內消失,而其所造成影響更是一個刻不容緩、代價不菲的重大威脅,處理一次web應用安全事故幾乎要花掉20萬美元。網絡安全工程師們務必要意識到,研究與防範SQL注入攻擊是必要的,也是首要的安全任務。 [5] 

sql注入注入過程

第一步:SQL注入點探測。探測SQL注入點是關鍵的一步,通過適當的分析應用程序,可以判斷什麼地方存在SQL注入點。通常只要帶有輸入提交的動態網頁,並且動態網頁訪問數據庫,就可能存在SQL注入漏洞。如果程序員信息安全意識不強,採用動態構造SQL語句訪問數據庫,並且對用户的輸入未進行有效性驗證,則存在SQL注入漏洞的可能性很大。一般通過頁面的報錯信息來確定是否存在SQL注入漏洞。 [6] 
第二步:收集後台數據庫信息。不同數據庫的注入方法、函數都不盡相同,因此在注入之前,我們先要判斷一下數據庫的類型。判斷數據庫類型的方法很多,可以輸入特殊字符,如單引號,讓程序返回錯誤信息,我們根據錯誤信息提示進行判斷;還可以使用特定函數來判斷,比如輸入“1 and version()>0”,程序返回正常,説明version()函數被數據庫識別並執行,而version()函數是MySQL特有的函數,因此可以推斷後台數據庫為MySQL。 [6] 
第三步:猜解用户名和密碼。數據庫中的表和字段命名一般都是有規律的。通過構造特殊SQL語句在數據庫中依次猜解出表名、字段名、字段數、用户名和密碼。 [6] 
第四步:查找Web後台管理入口。WEB後台管理通常不對普通用户開放,要找到後台管理的登錄網址,可以利用Web目錄掃描工具(如:wwwscan、AWVS)快速搜索到可能的登錄地址,然後逐一嘗試,便可以找到後台管理平台的登錄網址。 [6] 
第五步:入侵和破壞。一般後台管理具有較高權限和較多的功能,使用前面已破譯的用户名、密碼成功登錄後台管理平台後,就可以任意進行破壞,比如上傳木馬、篡改網頁、修改和竊取信息等,還可以進一步提權,入侵Web服務器和數據庫服務器。 [6] 

sql注入注入方法

由於編寫程序時未對用户輸入數據的合理性進行判斷,導致攻擊者能在SQL Injection的注入點中夾雜代碼進行執行,並通過頁面返回的提示,獲取進行下一步攻擊所需的信息。根據輸入的參數,可將SQL注入方式大致分為兩類:數字型注入、字符型注入。 [7] 
1、數字型注入
當輸入的參數為整型時,如ID、年齡、頁碼等,如果存在注入漏洞,則可以認為是數字型注入。這種數字型注入最多出現在ASP、PHP等弱類型語言中,弱類型語言會自動推導變量類型,例如,參數id=8,PHP會自動推導變量id的數據類型為int類型,那麼id=8 and 1=1,則會推導為string類型,這是弱類型語言的特性。而對於Java、C#這類強類型語言,如果試圖把一個字符串轉換為int類型,則會拋出異常,無法繼續執行。所以,強類型的語言很少存在數字型注入漏洞。 [7] 
2、字符型注入
當輸入參數為字符串時,稱為字符型。數字型與字符型注入最大的區別在於:數字型不需要單引號閉合,而字符串類型一般要使用單引號來閉合。 [7] 

sql注入攻擊特點

SQL注入 SQL注入
SQL注入攻擊是目前web應用網絡攻擊中最常見的手段之一,安全風險較高,在一定程度上超過緩衝區溢出漏洞,而市場上的防火牆又不能對SQL注入漏洞進行有效的檢測和防範。防火牆為了使正常網絡應用程序訪問服務器端的數據,必須允許從互聯網到Web服務器的正向連接,因此一旦web網絡應用程序存在注入漏洞,攻擊者就可以獲取訪問數據庫的權利進而獲得數據庫所在服務器的訪問權在某些情況下,SQL注入攻擊的風險要高於緩衝區溢出漏洞等所有其他漏洞。SQL注入攻擊普遍存在範圍廣、實現容易、破壞性大等特點。 [8] 
SQL注入攻擊者在HTTP請求中輸入含有惡意構造且語法合法的SQL語句,只要應用程序中沒有做嚴格的處理(例如校驗或預拼接),那麼就會出現SQL注入漏洞危險,目前以PHP、Perl、Cold Fusion Management等技術與Oracle、SQLServer、Sybase、DB2等數據管理系統相結合的Web應用程序都發現有SQL注入漏洞。 [8] 
SQL注入技術公佈後不久,互聯網上出現了很多例如教主的HDSI、NBSI、明小子的Domain等SQL注入工具,對那些存在SQL注入的網站以及Web應用程序進行攻擊,很容易就可以獲取其服務器的控制權。 [8] 

sql注入攻擊手法

1、基於布爾的盲注
因為web的頁面返回值都是True或者False,所以布爾盲注就是注入後根據頁面返回值來得到數據庫信息的一種辦法。 [1] 
2、基於時間的盲注
當布爾型注入沒有結果(頁面顯示正常)的時候,我們很難判斷注入的代碼是否被執行,也可以説到底這個注入點存不存在?這個時候布爾型注入就無法發揮自己的作用了。基於時間的盲注便應運而生,所謂基於時間的盲注,就是我們根據web頁面相應的時間差來判斷該頁面是否存在SQL注入點。 [1] 
3、聯合查詢注入
使用聯合查詢進行注入的前提是我們要進行注入的頁面必須有顯示位。所謂聯合查詢注入即是使用union合併兩個或多個SELECT語句的結果集,所以兩個及以上的select必須有相同列、且各列的數據類型也都相同。聯合查詢注入可在鏈接最後添加order by 9基於隨意數字的注入,根據頁面的返回結果來判斷站點中的字段數目。 [1] 
4、基於錯誤信息的注入
此方法是在頁面沒有顯示位,但是echo mysql_error();函數輸出了錯誤信息的時候方能使用。優點是注入速度快,缺點是語句較為複雜,而且只能用limit依次進行猜解。總體來説,報錯注入其實是一種公式化的注入方法,主要用於在頁面中沒有顯示位,但是用echo mysql_error();輸出了錯誤信息時使用。 [1] 

sql注入檢測技術

SQL注入的檢測方式目前主要有兩大類,第一:動態監測,即在系統運行時,通常在系統驗收階段或上線運行階段使用該方法,使用動態監測攻擊對其系統進行掃描,然後依據掃描結果判斷是否存在SQL注入漏洞。第二:靜態檢測,又稱靜態代碼掃描,對代碼做深層次分析。 [5] 
1、動態檢測
動態監測分為兩類:手工監測以及工具監測。相對於手動監測的高成本以及高漏檢率,在實際生產過程中更偏向於工具監測,但工具監測同樣存在較大的侷限性。其原因在於工具是用報文來判斷SQL注入是否生效,然而僅僅通過報文是很難精準地判斷SQL注入是否存在,因此存在較高的誤報率。 [5] 
2、靜態檢測
靜態檢測的誤報率相對較低,其主要原因在於SQL注入漏洞的代碼特徵較為明顯。 [5] 
(1)使用數據庫交互代碼; [5] 
(2)使用字符串拼接方式構造動態SQL語句; [5] 
(3)使用未過濾的不可信任數據。 [5] 
在常規的排查應用系統中是否存在SQL注入漏洞時,由於靜態掃描的代碼特徵明顯,誤報率低和直接閲讀相關代碼,工作總量減少的優勢,通常使用靜態掃描。 [5] 

sql注入注入防範措施

SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。 [9] 
1、分級管理
對用户進行分級管理,嚴格控制用户的權限,對於普通用户,禁止給予數據庫建立、刪除、修改等相關權限,只有系統管理員才具有增、刪、改、查的權限。例如上述實例中用户在查詢語句中加入了drop table。肯定是不能讓其執行的,否則系統的數據庫安全性就無法保障。故而通過權限的設計限制。使得即使惡意攻擊者在數據提交時嵌入了相關攻擊代碼。但因為設置了權限,從而使得代碼不能執行。從而減少SQL注入對數據庫的安全威脅。 [9] 
2、參數傳值
程序員在書寫SQL語言時,禁止將變量直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變量。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變量。這樣可以最大程度防範SQL注入攻擊。 [9] 
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交“and”等特殊字符,判斷是否存在漏洞,然後通過select、update等各種字符編寫SQL注入語句。因此防範SQL注入要對用户輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變量時,對於單引號、雙引號、冒號等字符進行轉換或者過濾,從而有效防止SQL注入。當然危險字符有很多,在獲取用户輸入提交的參數時,首先要進行基礎過濾,然後根據程序的功能及用户輸入的可能性進行二次過濾,以確保系統的安全性。 [9] 
4、使用安全參數
SQL數據庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer數據庫設計時設置了專門的SQL安全參數。在程序編寫時應儘量使用安全參數來杜絕注入式攻擊。從而確保系統的安全性。 [9] 
SQLServer數據庫提供了Parameters集合,它在數據庫中的功能是對數據進行類型檢查和長度驗證,當程序員在程序設計時加入了Parameters集合,系統會自動過濾掉用户輸入中的執行代碼,識別其為字符值。如果用户輸入中含有惡意的代碼,數據庫在進行檢查時也能夠將其過濾掉。同時Parameters集合還能進行強制執行檢查。一旦檢查值超出範圍。系統就會出現異常報錯,同時將信息發送系統管理員,方便管理員做出相應的防範措施。 [9] 
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以通過採購一些專門系統的SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。雖然漏洞掃描工具只能掃描到SQL注入漏洞,不能防範SQL注入攻擊。但系統管理員可以通過掃描到的安全漏洞,根據不同的情況採取相應的防範措施封堵相應的漏洞,從而把SQL注入攻擊的門給關上,從而確保系統的安全。 [9] 
6、多層驗證
現在的網站系統功能越來越龐大複雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問數據庫,並且向上層系統發出錯誤提示信息。同時在客户端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客户端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客户端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。 [9] 
7、數據庫信息加密
傳統的加解密的方法大致可以分為三種: [9] 
(1)對稱加密:即加密方和解密方都使用相同的加密算法和密鑰,這種方案的密鑰的保存非常關鍵,因為算法是公開的,而密鑰是保密的,一旦密匙泄露,黑客仍然可以輕易解密。常見的對稱加密算法有:AES、DES等。 [9] 
(2)非對稱加密:即使用不同的密鑰來進行加解密,密鑰被分為公鑰和私鑰,用私鑰加密的數據必須使用公鑰來解密,同樣用公鑰加密的數據必須用對應的私鑰來解密,常見的非對稱加密算法有:RSA等。 [9] 
(3)不可逆加密:利用哈希算法使數據加密之後無法解密回原數據,這樣的哈希算法常用的有:md5、SHA-1等。 [9] 
參考資料