二次注入

雨九九發表於2019-03-25

0x0 原理

針對場景:
存在另一處操作直接呼叫輸入資料而不做其他處理

 

 

關鍵:【尋找另一處引用這個資料的操作】如果另一處操作直接將1’作為變數帶進自身的sql語句中,且未做如轉義等處理,那1’的單引號便會發生作用,起到sql注入的效果

 

0x11 演示

以sqlilabs 24關為例

 

 

先點選forget your pass?出來如下頁面,看來是提示我們通過注入修改密碼

 

 

註冊一個新使用者,使用者名稱admin4‘#,密碼4444

 

 

註冊成功

 

 

這時候看資料庫,提前留意下admin4的密碼

 

 

以剛註冊的使用者登陸

 

 

修改密碼為4111

 

 

再看回資料庫

 

 

會發現被修改密碼的是admin4,而不是我們登陸的admin4’#,這就是二次注入

 

0x12解析

以24關的程式碼為例

 

回憶我們剛剛的操作,註冊admin4’#,修改admin4’#密碼,發現admin4的密碼被修改

重點在admin4’#的修改密碼操作

對應程式碼在pass_change.php

 

 

可以看到,執行的sql語句為

$sql=UPDATE users SET PASSWORD = ‘$pass’ where username = ‘$username’ and password = ‘$curr_pass’ ”;

 

當我們以admin4’#的使用者修改原密碼4444為新密碼4111時,執行的對應sql語句就為

$sql=UPDATE users SET PASSWORD =4111where username = ‘admin4’#’ and password =4444’”;

 

這條語句實際執行時產生的效果相當於

$sql=UPDATE users SET PASSWORD =4111where username = ‘admin4’;

 

也就是修改使用者admin4的密碼為4111,也就造成了二次注入

 

0x2 防禦

24關其實在註冊,登陸,修改密碼的資料帶入sql語句前都用了mysql_real_escape_string對特殊字元進行轉義,但修改密碼中, sql語句中的$username是直接通過$_SESSION["username"]從資料庫中提取的,這個變數並未進行處理就被帶入sql語句中執行了,進而導致單引號發揮作用,造成注入。

防止二次注入,要麼禁止輸入資料庫的變數中存在非法字元,如果必須要有字元,在資料出庫後,也要做好處理

資料的輸入輸出都要有處理

 

 

相關文章