SQL注入攻擊常見方式及測試方法

SQL注入攻擊常見方式及測試方法

SQL注入攻擊常見方式及測試方法


資料來源: https://blog.csdn.net/github_36032947/article/details/78442189


如何進行SQL注入攻擊?

1.數字注入

在瀏覽器地址欄輸入:learn.me/sql/article.php?id=1,這是一個get型接口,發送這個請求相當於調用一個查詢語句:

$sql = "SELECT * FROM article WHERE id =",$id

正常情況下,應該返回一個id=1的文章信息。那麼,如果在瀏覽器地址欄輸入:

learn.me/sql/article.php?id=-1 OR 1 =1

這就是一個SQL注入攻擊了,可能會返回所有文章的相關信息。為什麼會這樣呢?

這是因為,id = -1永遠是false,1=1永遠是true,所有整個where語句永遠是ture,所以where條件相當於沒有加where條件,那麼查詢的結果相當於整張表的內容

2.字符串注入

有這樣一個用戶登錄場景:登錄界麵包括用戶名和密碼輸入框,以及提交按鈕。輸入用戶名和密碼,提交。

這是一個post請求,登錄時調用接口learn.me/sql/login.html,首先連接數據庫,然後後台對post請求參數中攜帶的用戶名、密碼進行參數校驗,即sql的查詢過程。假設正確的用戶名和密碼為user和pwd123,輸入正確的用戶名和密碼、提交,相當於調用了以下的SQL語句:

SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'

由於用戶名和密碼都是字符串,SQL注入方法即把參數攜帶的數據變成mysql中註釋的字符串。mysql中有2種註釋的方法:

1)’#’:’#’後所有的字符串都會被當成註釋來處理

用戶名輸入:user’#(單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然後點擊提交按鈕。等價於SQL語句:

SELECT * FROM user WHERE username = 'user'#'ADN password = '111'

‘#’後面都被註釋掉了,相當於:

SELECT * FROM user WHERE username = 'user' 

2)’– ‘ (–後面有個空格):’– ‘後面的字符串都會被當成註釋來處理

用戶名輸入:user’–(注意–後面有個空格,單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然後點擊提交按鈕。等價於SQL語句:

SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'

‘– ‘後面都被註釋掉了,相當於:

SELECT * FROM user WHERE username = 'user'

因此,以上兩種情況可能輸入一個錯誤的密碼或者不輸入密碼就可登錄用戶名為’user’的賬號,這是十分危險的事情。



如何預防SQL注入?

這是開發人員應該思考的問題,作為測試人員,了解如何預防SQL注入,可以在發現注入攻擊bug時,對bug產生原因進行定位。


1)嚴格檢查輸入變量的類型和格式

    對於整數參數,加判斷條件:不能為空、參數類型必須為數字

    對於字符串參數,可以使用正則表達式進行過濾:如:必須為[0-9a-zA-Z]範圍內的字符串


2)過濾和轉義特殊字符

    在username這個變量前進行轉義,對’、”、\等特殊字符進行轉義,如:php中的addslashes()函數對username參數進行轉義


3)利用mysql的預編譯機制

    把sql語句的模板(變量採用佔位符進行佔位)發送給mysql服務器,mysql服務器對sql語句的模板進行編譯,編譯之後根據語句的優化分析對相應的索引進行優化,在最終綁定參數時把相應的參數傳送給mysql服務器,直接進行執行,節省了sql查詢時間,以及mysql服務器的資源,達到一次編譯、多次執行的目的,除此之外,還可以防止SQL注入。具體是怎樣防止SQL注入的呢?實際上當將綁定的參數傳到mysql服務器,mysql服務器對參數進行編譯,即填充到相應的佔位符的過程中,做了轉義操作。



SQL 注入 笑話























2 thoughts on “SQL注入攻擊常見方式及測試方法

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *