1、SQL注入原理
就是通過利用一些查詢語句的漏洞,將SQL語句傳遞到服務器解析並執行的一種攻擊手段。SQL注入是一種注入攻擊,可以執行惡意SQL語句。它通過將任意SQL代碼插入數據庫查詢,使攻擊者能夠完全控制Web應用程序後面的數據庫服務器。攻擊者可以使用SQL注入漏洞繞過應用程序安全措施;可以繞過網頁或Web應用程序的身份驗證和授權,並檢索整個SQL數據庫的內容;還可以使用SQL注入來添加,修改和刪除數據庫中的記錄。
SQL注入漏洞可能會影響使用SQL數據庫(如MySQL,Oracle,SQL Server或其他)的任何網站或Web應用程序。犯罪分子可能會利用它來未經授權訪問用戶的敏感數據:客戶信息,個人數據,商業機密,知識產權等。SQL注入攻擊是最古老,最流行,最危險的Web應用程序漏洞之一。
2、常見的SQL注入場景
常見的sql注入之萬能密碼
原理:用戶進行用戶名和密碼驗證時,網站需要查詢數據庫。查詢數據庫就是執行SQL語句,但在查詢過程中,並未對一些特殊符號進行過濾,如單引號(')
舉一個例子:
(1)用戶登錄時,後臺執行的數據庫查詢操作(SQL語句)是:
【Select user_id,user_type,email From users Where user_id=’用戶名’ And password=’密碼’】。
(2)由於網站後臺在進行數據庫查詢的時候沒有對單引號進行過濾,當輸入用戶名【admin】和萬能密碼【1’or’1】時,執行的SQL語句爲:
【Select user_id,user_type,email From users Where user_id=’admin’ And password=’1’or’1’】。
(3)由於SQL語句中邏輯運算符具有優先級,【=】優先於【and】,【and】優先於【or】,且適用傳遞性。因此,此SQL語句在後臺解析時,分成兩句:
【Select user_id,user_type,email From users Where user_id=’admin’ And password=’1’】和【’1’】,兩句bool值進行邏輯or運算,恆爲真。
SQL語句的查詢結果爲TRUE,就意味着認證成功,也可以登錄到系統中。輸入用戶名【admin】,密碼【1’or’1】,即可登錄成功。
3、如何防止SQL注入?
(1)不要使用動態SQL
避免將用戶提供的輸入直接放入SQL語句中;最好使用準備好的語句和參數化查詢,這樣更安全。
(2)不要將敏感數據保留在純文本中
加密存儲在數據庫中的私有/機密數據;這樣可以提供了另一級保護,以防攻擊者成功地排出敏感數據。
(3)限制數據庫權限和特權
將數據庫用戶的功能設置爲最低要求;這將限制攻擊者在設法獲取訪問權限時可以執行的操作。
(4)避免直接向用戶顯示數據庫錯誤
攻擊者可以使用這些錯誤消息來獲取有關數據庫的信息。
(5)對訪問數據庫的Web應用程序使用Web應用程序防火牆(WAF)
這爲面向Web的應用程序提供了保護,它可以幫助識別SQL注入嘗試;根據設置,它還可以幫助防止SQL注入嘗試到達應用程序(以及數據庫)。
(6)定期測試與數據庫交互的Web應用程序
這樣做可以幫助捕獲可能允許SQL注入的新錯誤或迴歸。
(7)將數據庫更新爲最新的可用修補程序
這可以防止攻擊者利用舊版本中存在的已知弱點/錯誤。