二次注入在測試的時候比較少見,或者說很難被測出來,因為測的時候首先要去找注入的位置,其次是去判斷第一次執行的SQL語句,然后還要去判斷第二次進行調用的 SQL 語句。而關鍵問題就出在第二次的調用上面。
下面以一個常用過濾方法來說明具體問題。
通過addslashes函數的轉換可以將查詢語句中的單引號進行轉義,避免了在查詢中出現 SQL 注入的問題。那我們接下來換一個語句,看一下會出現什么效果。
能夠發現我們插入語句中的單引號在執行SQL語句的時候是被轉義了的,而在數據庫中這個單引號卻還是被直接存放在數據庫沒有添加我們的轉義符。
這也是addslashes函數的一個特點,只負責在查詢之前進行轉義危險字符,但不會修改原始數據。那么當被插入的危險數據又被調用成查詢條件呢?這個時候就變成二次注入了。
其中 addslashes 函數中的數據是用戶插入的數據,先不談這個程序的邏輯有點愚蠢,因為只是為了演示,現實中的程序會將第一次的查詢結果用來操作另外的數據表或者進行刪改操作。
可以看到最終執行的語句就一個盲注的語法。