SQL注入的原理與預防


1. 什么是SQL注入?

SQL注入是常見的網絡攻擊方式之一,通過SQL語句實現無賬號登錄,非法獲取甚至篡改數據庫中的數據。

2. SQL注入的思路

(1)找到SQL注入位置;

(2)判斷服務器類型和后台數據庫類型;

(3)針對不同的服務器和數據庫進行SQL注入攻擊;

3. SQL注入的實例——'or 1=1 --始終為真

(1)匿名登錄

用戶名 SQL injection
密碼  
驗證碼 'or 1=1--

 

 

 

這是一個很常見的登錄界面,如果系統對用戶的輸入沒有數據約束來阻止錯誤輸入,那么用戶可以故意的輸入一些錯誤輸入。當用戶輸入以上數據時,對應的SQL語句如下:

SELECT * From Users WHERE UserId='SQL inject' and Password='' and Seccode='' or 1=1--'

可以看到Seccode這一字段的前半個單引號被閉合了,后半個單引號被“--”注釋掉了。無論前面的UserId和Password輸入正確與否,總有“1=1”成立,所以可以輕松騙過系統,實現匿名登錄。

(2)獲取數據庫和服務器操作系統信息

用戶名 SQL injection
密碼  
驗證碼 'or 1=(SELECT @@VERSION)--

 

 

 

 現在判定條件變成了 1=(SELECT @@VERSION),這種寫法肯定會導致錯誤,但就是要利用這種錯誤來獲取我們想要的信息。點擊登錄之后,頁面返回以下信息:

Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45
 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.

  可以看到服務器的操作系統信息和數據庫的版本信息通過錯誤顯示出來。

 

4. 預防SQL注入

(1)使用java PreparedStatement

之所以PreparedStatement能防止注入,是因為它把單引號轉義了,變成了\',這樣一來,就無法截斷SQL語句,進而無法拼接SQL語句,基本上沒有辦法注入了。

String sql = "select * from Users where min_name = ?";  // 含有參數
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "'or1=1--"); // 參數賦值
System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@d704f0:select * from goods where min_name = '\'or1=1'

   

(2)使用正則表達式過濾傳入的參數;

(3)對用戶輸入的數據類型做嚴格限制;

(4)在應用發布之前建議使用專業的SQL注入檢測工具進行檢測,以及時修補被發現的SQL注入漏洞。網上有很多這方面的開源工具,例如sqlmap、SQLninja等。

(5)避免網站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。


 

總結:

關於安全性,本文可總結出一下幾點:

  1. 對用戶輸入的內容要時刻保持警惕。
  2. 只有客戶端的驗證等於沒有驗證。
  3. 永遠不要把服務器錯誤信息暴露給用戶。

除此之外,我還要補充幾點:

  1. SQL注入不僅能通過輸入框,還能通過Url達到目的。
  2. 除了服務器錯誤頁面,還有其他辦法獲取到數據庫信息。
  3. 可通過軟件模擬注入行為,這種方式盜取信息的速度要比你想象中快的多。
  4. 漏洞跟語言平台無關,並非asp才有注入漏洞而asp.net就沒有注入漏洞,一切要看設計者是否用心。

 


參考:https://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM