1.什麼是二階注入?
所謂二次注入是指已存儲(數據庫、文件)的用戶輸入被讀取後再次進入到 SQL 查詢語句中導致的注入。
二次注入是sql注入的一種,但是比普通sql注入利用更加困難,利用門檻更高。普通注入數據直接進入到 SQL 查詢中,而二次注入則是輸入數據經處理後存儲,取出後,再次進入到 SQL 查詢。
2.二次注入的原理
二次注入的原理,在第一次進行數據庫插入數據的時候,僅僅只是使用了 addslashes 或者是藉助 get_magic_quotes_gpc 對其中的特殊字符進行了轉義,在寫入數據庫的時候還是保留了原來的數據,但是數據本身還是髒數據。
在將數據存入到了數據庫中之後,開發者就認爲數據是可信的。在下一次進行需要進行查詢的時候,直接從數據庫中取出了髒數據,沒有進行進一步的檢驗和處理,這樣就會造成SQL的二次注入。比如在第一次插入數據的時候,數據中帶有單引號,直接插入到了數據庫中;然後在下一次使用中在拼湊的過程中,就形成了二次注入。
3.普通注入與二次注入的區別:
普通注入 (1)在http後面構造語句,是立即直接生效的
(2)一次注入很容易被掃描工具掃描到
二次注入 (1) 先構造語句(有被轉義字符的語句)
(2)我們構造的惡意語句存入數據庫
(3)第二次構造語句(結合前面已經存入數據庫的語句,成功。因爲系統沒有對已經存入數據庫的數據做檢查)
(4)二次注入更加難以被發現
4.二次注入的實例
先註冊賬號密碼,admin'#
然後登陸進去會讓你修改新的密碼:
修改成功
查看源碼,發現登陸處的username和password都經過了mysql_real_escape_string函數的轉義,直接執行SQL語句會轉義’,所以該處無法造成SQL注入。
註冊用戶的時候用了mysql_escape_string過濾參數:
數據庫中還是插入了問題數據admin'#,原因是經過mysql_escape_string轉義的數據存入數據庫後被還原
我們以admin'#用戶登陸,再進行密碼修改
發現admin的密碼被改變了
現在的密碼
5.密碼改變的原因:
Username直接從數據庫中取出,沒有經過轉義處理。在更新用戶密碼的時候其實執行了下面的命令:
“UPDATEusers SET PASSWORD=’22′ where username=’admin’#‘ and password=’$curr_pass’”;
因爲我們將問題數據存儲到了數據庫,而程序再取數據庫中的數據的時候沒有進行二次判斷便直接帶入到代碼中,從而造成了二次注入;