回覆列表
  • 1 # 使用者3638407864430

    一、為什麼會有SQL注入

    是使用者輸入的內容在伺服器中能夠被拼接查詢,從而輸出惡意使用者期望的內容,那麼要防止SQL注入,就是阻止惡意使用者輸入的惡意資訊被資料庫執行並且輸出。

    1. 對於數字型注入,不需要單引號個的情況下

    可以將payload跟在引數後邊,不受過濾和轉義的影響

    $id=$_POST["id"];

    $sql = select username from users where id= $id union select database();

    2. 寬位元組注入(但是要使用gbk編碼)

    在使用gbk編碼時,系統會認為兩個字元是一個漢字的編碼(前一個字元必須大於128)。

    輸入%df%27時首先經過上面提到的單引號轉義變成了%df%5c%27(%5c是反斜槓\),之後在資料庫查詢前由於使用了GBK多位元組編碼,即在漢字編碼範圍內兩個位元組會被編碼為一個漢字。然後MySQL伺服器會對查詢語句進行GBK編碼即%df%5c轉換成了漢字“運”,而單引號逃逸了出來

    3. 使用編碼的形式

    查詢的資料在經過webserver時會被解碼一次

    id=1%2527 --->webserver --> id=1%27 --> urldecode--> 1"

    4. 二次注入

    二次注入漏洞字面上理解可能就是結合兩個注入漏洞點實現sql注入的目的,但是這其中還有幾個細節需要講解一下。首先,第一個注入點因為經過過濾處理所以無法觸發SQL注入漏洞,比如addslashes函式,將單引號等字元轉義變成\’。但是存進資料庫後,資料又被還原了,也就是反斜槓沒了,在這種情況下,如果能發現一個新的注入同時引用了被插入了的資料庫資料,就可以實現閉合新發現的注入漏洞引發漏洞。

    二、如何防止SQL注入

    透過上邊的四種方式完美的繞過了反斜槓和單引號轉義是否能防止SQL注入的問題,哪如何能防止SQL注入呢?

    1、所有的查詢語句都使用資料庫提供的引數化查詢介面,引數化的語句使用引數而不是將使用者輸入變數嵌入到SQL語句中。當前幾乎所有的資料庫系統都提供了引數化SQL語句執行介面,使用此介面可以非常有效的防止SQL注入攻擊。

    2、對進入資料庫的特殊字元(’”<>&*;等)進行轉義處理,或編碼轉換。

    3、確認每種資料的型別,比如數字型的資料就必須是數字,資料庫中的儲存欄位必須對應為int型。

    4、資料長度應該嚴格規定,能在一定程度上防止比較長的SQL注入語句無法正確執行。

    5、網站每個資料層的編碼統一,建議全部使用UTF-8編碼,上下層編碼不一致有可能導致一些過濾模型被繞過。

    6、嚴格限制網站使用者的資料庫的操作許可權,給此使用者提供僅僅能夠滿足其工作的許可權,從而最大限度的減少注入攻擊對資料庫的危害。

    7、避免網站顯示SQL錯誤資訊,比如型別錯誤、欄位不匹配等,防止攻擊者利用這些錯誤資訊進行一些判斷。

  • 中秋節和大豐收的關聯?
  • 女人缺蛋白質的症狀有什麼?