SQL

我們如何保護我們的代碼不受黑客和不良行為的影響?

SQL注入是一個網絡安全漏洞,攻擊者可以利用它更改對數據庫的SQL查詢。這可用於檢索一些敏感信息,例如數據庫結構,表,列及其基礎數據。

例如,假設應用程序使用以下查詢來獲取某人的登錄詳細信息:

SELECT USERNAME,PASSWORD from USERS where USERNAME='<username>' AND PASSWORD='<password>';
/<password>/<username>

這裡,username和password是由用戶提供的輸入。假設攻擊者' OR '1'='1在兩個字段中都給出了輸入。因此,SQL查詢將類似於:

SELECT USERNAME,PASSWORD from USERS where USERNAME='' OR '1'='1' AND PASSWORD='' OR '1'='1';

該查詢產生一個正確的語句,因此用戶登錄。此示例描述了SQL注入的最基本類型。

SQL注入可用於任何地方以從數據庫中獲取任何敏感信息。

注意:這是最基本的示例,僅用於理解目的。在現實世界中,您幾乎找不到任何此類案例。

您可以使用此備忘單來查看如何在不同的SQL數據庫提供程序上進行查詢。


如何檢測SQ​​L注入的存在?

在大多數情況下,SQL注入可以很容易地通過提供無效參數,如檢測到','' a' or 1=1--,"a"" or 1=1--",or a = a,a' waitfor delay '0:0:10'--,1 waitfor delay '0:0:10'--,%26,' or username like '%,等你可以再觀察應用程序的行為變化。

您可以嘗試分析服務器響應的長度以及發送響應所花費的時間。諸如',a' or 1=1--等的有效負載可能會顯示數據庫服務器響應中的更改。但是,如果沒有變化,那麼我們嘗試使用像這樣的有效負載觸發時間延遲a' waitfor delay '0:0:10'--。這可能會使服務器在發送響應之前延遲特定時間。

確定網站是否容易受到攻擊後SQL Injection,我們可以嘗試從數據庫中提取一些敏感信息。

在此之前,我們需要確定number of columnsSQL查詢返回的內容。這很重要,因為如果我們嘗試提取的列數與查詢實際返回的列數不相等,那麼它將返回錯誤。

我們可以使用order by命令確定列數。例如:

[www.onlineshopping.com/products.php?pid=8](http://www.onlineshopping.com/products.php?pid=8) order by 1 -- //
www.onlineshopping.com/products.php?pid=8 order by 2 -- //// If the parameter is a string then you need to add ' after it.www.onlineshopping.com/products.php?usr=b' order by 3 -- //
www.onlineshopping.com/products.php?usr=a' order by 4 -- //

--意義在於它是SQL中的註釋指示符,它使查詢的其餘部分成為註釋。現在為了保留spaceafter --,我們在其後添加任何字符,以便space在HTTP request。根據SQL數據庫提供程序的不同,我們可能還會使用#或/* */進行註釋。

繼續此過程,直到遇到錯誤。如果在使用有效負載時遇到錯誤,order by 5但在使用時卻沒有order by 4,這意味著查詢返回4列。


如何使用SQL注入進行利用

一旦你知道應用程序容易受到SQL注入和你已經確定的列數,我們試圖找到有關數據庫,如必要的信息DB name,DB user name,DB version,table names,column names所需要的表,等退房的SQL注入小抄查找相應的查詢。


SQL注入的類型

  1. 基於錯誤:這種SQL注入依賴於error messages數據庫服務器拋出的錯誤,這可能會向我們提供有關數據庫結構的一些有用信息。
  2. 基於聯合的:此技術使用SQL UNION運算符組合兩個SELECT查詢的結果並返回單個表。通過將結果附加到對數據庫進行的原始查詢,攻擊者可以從其他表中提取信息。
  3. 盲注:當應用程序容易受到攻擊SQL Injection但的結果SQL query未在中返回時,就會發生這種情況HTTP response。在這種情況下,我們在數據庫中查詢任何true / false語句,並查看true和false條件的更改。它有兩種類型:
  4. 基於內容的:在此技術中,response在發送true條件和false條件時,將使用任何條件語句查詢數據庫服務器,並分析服務器中的條件差異。
  5. 基於時間的:此技術依賴於注入SQL查詢,該查詢使數據庫根據指定的條件等待特定的時間。服務器發送迴響應所花費的時間確定查詢是對還是錯。
  6. 帶外注入(不常見):這不是一種很常見的類型,SQL Injection因為它取決於數據庫服務器上啟用的功能。它依賴於數據庫服務器的能力,使像一個Web請求HTTP,DNS以及ftp將數據發送給攻擊者。

如何保護您的代碼免受SQL注入?

  1. 切勿直接用用戶輸入構造查詢。相反,請使用參數化語句。他們確保安全處理傳遞給SQL查詢的輸入。
  2. 清理用戶輸入始終是一件好事。另外,應進行適當的
    輸入驗證,例如,名稱不能為數字或電話號碼不能為字母。但是,有時可以繞開它。
  3. 使用安全的驅動程序與SQL數據庫進行交互。它們自動防止所有SQL注入攻擊。例如,適用於python的SQLAlchemy。

資源資源

  1. SQL Map是一個開放源代碼工具,automates用於處理detecting和exploiting注入SQL漏洞。
  2. 此存儲庫上有一些很酷的資源SQL Injection。其中包括一些備忘單和許多有用的有效負載,這些負載可以根據用例使用。

翻譯自:https://medium.com/better-programming/a-beginners-guide-to-sql-injection-163c1ad2257f


分享到:


相關文章: