又是一次靶场练习,今天为各位小伙伴带来一次sql注入中二次注入的一次训练!
二次注入
开始之前需要 大家了解什么是二次注入,简单来说就是用户输入的数据会经过转义,但是即使转义,最终存在于数据库中的依旧还是用户输入的原始数据,第二次对数据进行处理时候直接从数据库中取出原始数据,数据中一般带有单引号和#号,然后下次使用在拼凑SQL中,所以就形成了二次注入。
sqli-24靶场分析
首先分析一下,一看这种登录框 有注册页面 还有修改密码页面
可能也会想到二次注入。但是二次注入毕竟还是不会这么简单就被发现的所以一般都是在代码审计中发现这样的注入漏洞.
二次注入的几个要点
- 知道存在用户的一个用户名
- 第一次注册时候 数据经过转义
- 二次修改直接从数据库中提取,不进行转义
查看源代码
假设我们此时已经知道了admin 这个用户 此时我们如何创建一个用户并且最后能够通过二次注入 将其密码修改成我们所需要的?
修改密码的源代码
# Validating the user input........
$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!!!! :( ';
}
可以看到我们的用户修改数据库时候直接用的直接用的 "UPDATE users SET PASSWORD=‘ p a s s ′ w h e r e u s e r n a m e = ′ pass' where username=' pass′whereusername=′username’ and password=‘$curr_pass’ ";
这条语句直接用$username 如果我们修改的用户名提交的是admin’# 再将他拼接到这条语句你会发现我们修改的不是admin’# 而是admin 的密码 此时我们就可以利用admin用户登陆
准备就绪 直接打
首先注册一个admin’#的用户
直接修改密码 然后你用admin的用户登陆 就用修改后的密码 神奇的一幕发生… 你登上去了…成功!
总结:
其实二次注入并不难理解 ,只不过可能用的比较困难需要很多的前提条件!