一 sql-inject的概述
sql注入(sqli)是一種注入攻擊,,可以執行惡意sql語句。它通過將任意sql**插入資料庫查詢,使攻擊者能夠完全控制web應用程式後面的資料庫伺服器。攻擊者可以使用sql注入漏洞繞過應用程式安全措施;可以繞過網頁或web應用程式的身份驗證和授權,並檢索整個sql資料庫的內容;還可以使用sql注入來新增,修改和刪除資料庫中的記錄。
sql注入漏洞可能會影響使用sql資料庫(如mysql,oracle,sql server或其他)的任何**或web應用程式。犯罪分子可能會利用它來未經授權訪問使用者的敏感資料:客戶資訊,個人資料,商業機密,智財權等。sql注入攻擊是最古老,最流行,最危險的web應用程式漏洞之一。
二.sql注入的產生原因通常表現在以下幾方面:
①不當的型別處理;
②不安全的資料庫配置;
③不合理的查詢集處理;
④不當的錯誤處理;
⑤轉義字元處理不合適;
⑥多個提交處理不當。
三.sql注入技術
1.強制產生錯誤
對資料庫型別、版本等資訊進行識別是此型別攻擊的動機所在。它的目的是收集資料庫的型別、結構等資訊為其他型別的攻擊做準備,可謂是攻擊的乙個預備步驟。利用應用程式伺服器返回的預設錯誤資訊而取得漏洞資訊。
2.採用非主流通道技術
除http響應外,能通過通道獲取資料,然而,通道大都依賴與資料庫支援的功能而存在,所以這項技術不完全適用於所有的資料庫平台。sql注入的非主流通道主要有e-mail、dns以及資料庫連線,基本思想為:先對sql查詢打包,然後借助非主流通道將資訊反饋至攻擊者。
3.使用特殊的字元
不同的sql資料庫有許多不同是特殊字元和變數,通過某些配置不安全或過濾不細緻的應用系統能夠取得某些有用的資訊,從而對進一步攻擊提供方向。
使用條件語句
此方式具體可分為基於內容、基於時間、基於錯誤三種形式。一般在經過常規訪問後加上條件語句,根據資訊反饋來判定被攻擊的目標。
4.利用儲存過程
通過某些標準儲存過程,資料庫廠商對資料庫的功能進行擴充套件的同時,系統也可與進行互動。部分儲存過程可以讓使用者自行定義。通過其他型別的攻擊收集到資料庫的型別、結構等資訊後,便能夠建構執行儲存過程的命令。這種攻擊型別往往能達到遠端命令執行、特權擴張、拒絕服務的目的。
避開輸入過濾技術
雖然對於通常的編碼都可利用某些過濾技術進行sql注入防範,但是鑑於此種情況下也有許多方法避開過濾,一般可達到此目的的技術手段包括sql注釋和動態查詢的使用,利用截斷,url編碼與空位元組的使用,大小寫變種的使用以及巢狀剝離後的表示式等等。借助於此些手段,輸入構思後的查詢可以避開輸入過濾,從而攻擊者能獲得想要的查詢結果。
5.推斷技術
能夠明確資料庫模式、提取資料以及識別可注入引數。此種方式的攻擊通過**對使用者輸入的反饋資訊,對可注入引數、資料庫模式推斷,這種攻擊構造的查詢執行後獲得的答案只有真、假兩種。基於推斷的注入方式主要分為時間測定注入與盲注入兩種。前者是在注入語句裡加入語句諸如「waitfor 100」,按照此查詢結果出現的時間對注入能否成功和資料值範圍的推導進行判定;後者主要是「and l=l」、「and l=2」兩種經典注入方法。這些方式均是對一些間接關聯且能取得回應的問題進行提問,進而通過響應資訊推斷出想要資訊,然後進行攻擊。
二.sql注入攻擊的型別(3).union注入
(4).基於insert update delete的注入
1.帶內注入
這是典型的攻擊,攻擊者可以通過相同的通訊通道發起攻擊並獲得結果。這是通過兩種帶內技術完成的:
● 基於錯誤的sql注入:從顯示的錯誤訊息中獲取有關資料庫的資訊
● 基於聯合的sql注入:依賴於攻擊者能夠將union all被盜資訊的結果與合法結果連線起來。
這兩種技術都依賴於攻擊者修改應用程式傳送的sql,以及瀏覽器中顯示的錯誤和返回的資訊。如果應用程式開發人員或資料庫開發人員無法正確地引數化他們在查詢中使用的值,那麼它會成功。兩者都是試錯法,可以檢測到錯誤。
int型注入點和字元型都採用按位或|和按位異或^獲取資料。
如果拼接的值為0,可以採用按位或|運算顯示查詢到的資料,如果拼接的值不是0(以100為例),可以採用按位異或^運算顯示運算後的資料,然後再異或一次可以恢復查詢的資料。
2.盲注入
也稱為推理sql注入,盲注入攻擊不會直接從目標資料庫中顯示資料;相反,攻擊者會仔細檢查行為中的間接線索。http響應中的詳細資訊,某些使用者輸入的空白網頁以及資料庫響應某些使用者輸入需要多長時間,這些都可以是線索,具體取決於攻擊者的目標。他們還可以指向攻擊者嘗試的另乙個sqli攻擊途徑。
3.帶外注入
這種攻擊有點複雜,當攻擊者無法在單個直接查詢 - 響應攻擊中實現其目標時,攻擊者可能會使用此攻擊。通常,攻擊者會製作sql語句,這些語句在呈現給資料庫時會觸發資料庫系統建立與攻擊者控制的外部伺服器的連線。以這種方式,攻擊者可以收集資料或可能控制資料庫的行為。
4.二階注入
一種帶外注入攻擊。在這種情況下,攻擊者將提供sql注入,該注入將由資料庫系統的單獨行為儲存和執行。當二級系統行為發生時(它可能類似於基於時間的作業或由其他典型管理員或使用者使用資料庫觸發的某些事情)並且執行攻擊者的sql注入,那就是當「伸出」到系統時攻擊者控制發生了。
三.sql注入防範
了解了sql注入的方法,如何能防止sql注入?如何進一步防範sql注入的氾濫?通過一些合理的操作和配置來降低sql注入的危險。
1.使用引數化的過濾性語句
要防禦sql注入,使用者的輸入就絕對不能直接被嵌入到sql語句中。恰恰相反,使用者的輸入必須進行過濾,或者使用引數化的語句。引數化的語句使用引數而不是將使用者輸入嵌入到語句中。在多數情況中,sql語句就得以修正。然後,使用者輸入就被限於乙個引數。
2.輸入驗證
檢查使用者輸入的合法性,確信輸入的內容只包含合法的資料。資料檢查應當在客戶端和伺服器端都執行之所以要執行伺服器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。在客戶端,攻擊者完全有可能獲得網頁的源**,修改驗證合法性的指令碼(或者直接刪除指令碼),然後將非法內容通過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。你可以使用許多內建的驗證物件,例如regular expression validator,它們能夠自動生成驗證用的客戶端指令碼,當然你也可以插入伺服器端的方法呼叫。如果找不到現成的驗證物件,你可以通過custom validator自己建立乙個。
3.錯誤訊息處理
防範sql注入,還要避免出現一些詳細的錯誤訊息,因為黑客們可以利用這些訊息。要使用一種標準的輸入確認機制來驗證所有的輸入資料的長度、型別、語句、企業規則等。
4.加密處理
將使用者登入名稱、密碼等資料加密儲存。加密使用者輸入的資料,然後再將它與資料庫中儲存的資料比較,這相當於對使用者輸入的資料進行了「消毒」處理,使用者輸入的資料不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入sql命令。
5.儲存過程來執行所有的查詢
四.如何防止sql注入攻擊?*
以下建議可以幫助防止sql注入攻擊成功:
1.不要使用動態sql
避免將使用者提供的輸入直接放入sql語句中;最好使用準備好的語句和引數化查詢,這樣更安全。
2.不要將敏感資料保留在純文字中
加密儲存在資料庫中的私有/機密資料;這樣可以提供了另一級保護,以防攻擊者成功地排出敏感資料。
3限制資料庫許可權和特權
將資料庫使用者的功能設定為最低要求;這將限制攻擊者在設法獲取訪問許可權時可以執行的操作。
避免直接向使用者顯示資料庫錯誤
攻擊者可以使用這些錯誤訊息來獲取有關資料庫的資訊。
對訪問資料庫的web應用程式使用web應用程式防火牆(waf)
這為面向web的應用程式提供了保護,它可以幫助識別sql注入嘗試;根據設定,它還可以幫助防止sql注入嘗試到達應用程式(以及資料庫)。
定期測試與資料庫互動的web應用程式
這樣做可以幫助捕獲可能允許sql注入的新錯誤或回歸。
將資料庫更新為最新的可用修補程式
這可以防止攻擊者利用舊版本中存在的已知弱點/錯誤
sql-inject漏洞攻擊流程.
SQL注入漏洞
sql注入漏洞曾經是web應用程式的噩夢,cms bbs blog無一不曾受其害。sql注入的原理 以往在web應用程式訪問資料庫時一般是採取拼接字串的形式,比如登入的時候就是根據使用者名稱和密碼去查詢 string sql select top 1 from user where username...
SQL注入漏洞
sql注入,就是通過把sql命令插入到web表單遞交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令,比如先前的很多影視 洩露vip會員密碼大多就是通過web表單遞交查詢字元暴出的,這類表單特別容易受到sql注入式攻擊 sql注入的發生 當應用程式使用輸入內容來構造動態sq...
sql注入漏洞
什麼是sql注入 通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。通俗地講,它是利用現有應用程式,將 惡意 的sql命令注入到後台資料庫引擎執行的能力,它可以通過在web表單中輸入 惡意 sql語句得到乙個存在安全漏洞的 上的資料庫,而...