二次注入須要具有的兩個條件:php
(1)用戶向數據庫插入惡意語句(即便後端代碼對語句進行了轉義,如mysql_escape_string、mysql_real_escape_string轉義)mysql
(2)數據庫對本身存儲的數據很是放心,直接取出惡意數據給用戶sql
(1)在sqli_libs的第24關,其頁面以下所示:數據庫
(2)當咱們點擊Forgot your password?時,出現提示:後端
(3)所以能夠嘗試在註冊頁面進行二次注入,首先,咱們註冊一個帳號,名爲:admin'# ,密碼爲:123456spa
(4)註冊成功,嘗試登陸admin‘# ,而後能夠查看一下phpmyadmin內存儲狀況3d
(5)而這時的admin原密碼是admin,而且兩個帳號都存儲在數據庫內的。當咱們從新修改admin'#的密碼的時候,這裏修改成:12345678;能夠發現二次注入的威力所在。admin的密碼被修改成了:12345678;而admin'#用戶的密碼並無發生變化。blog
(6)代碼審計,嘗試分析源碼,出現問題的頁面很顯然是註冊頁面,與密碼修改重置的頁面。內存
註冊用戶時:源碼
僅對特殊字符進行了轉義,判斷輸入兩次密碼是否一致,而後將用戶鍵入,將數據插入至數據庫。
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")"
這裏直接插入了數據
修改密碼時:
$username= $_SESSION["username"];//直接取出了數據庫的數據
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";//對該用戶的密碼進行更新
$sql = "UPDATE users SET PASSWORD='12345678' where username='admin‘#
執行成功!
(1)對外部提交數據謹慎
(2)從數據庫取數據時,不能輕易相信查詢出的數據,要作到一樣的轉義或是甄別