二次注入原理及防護

原理:

二次注入須要具有的兩個條件: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)從數據庫取數據時,不能輕易相信查詢出的數據,要作到一樣的轉義或是甄別

相關文章
相關標籤/搜索