-
二次注入的原理:
主要分两步,第一步就是进行数据库插入数据的时候,仅仅对其中的特俗字符进行了转义,但是数据库保存的数据仍然具有恶意内容。第二步就是在下一次进行数据的查询过程中,直接从数据库中取得恶意数据(开发者认为数据是可信的),这样就造成了SQL的二次注入。 -
实例:sqlilabs-less24
二次注入会出现在注册的页面:
点击进入注册界面:
此时数据库中的users为:
- 我们们向数据库中插入恶意数据: username:wenhao’# password: 123456
此时的数据已经插入到数据库当中,当我们再次访问时:
- 我们进行密码的修改: current password:123456 new password:asdf 我们再次查询数据库时
:
发现wenhao的账户密码被更改了,而wenhao’#的密码没有被更改,此时就是实现了SQL的二次注入
- 这时候我们查阅源代码:
$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$re_pass= mysql_real_escape_string($_POST['re_password']);
if($pass==$re_pass)
{
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
$row = mysql_affected_rows();
echo '<font size="3" color="#FFFF00">';
echo '<center>';
if($row==1)
{`在这里插入代码片`
echo "Password successfully updated";
}
else
{
header('Location: failed.php');
//echo 'You tried to be smart, Try harder!!!! :( ';
}
- 这是更改密码的php,我们将用户名和更改的密码带入到update语句
$sql = "UPDATE users SET PASSWORD='asdf' where username='wenhao'#' and password='$curr_pass' ";
- 先用’闭合掉username的’引号,然后用#注释掉后面的语句,此时本来要更该wenhao’#的密码,但是username成了wenhao,所以wenhao’#的密码没有变,而wenhao的密码发生了改变。