目录
1.什么是二次注入?
2.二次注入过程
2.1寻找注入点
2.2注册admin'#用户
2.3修改密码
1.什么是二次注入?
当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿出该用户名时没有对'和#进行转义,导致将密码的检测注释了,虽然看似后端代码将我们输入的'进行了转义,但是当将输入的数据存储到数据库中时,会将'加上存储的(数据库存储数据的特征),这样就实现了二次注入,也叫做存储型SQL注入。
2.二次注入过程
登录页面
注册页面
修改密码页面
2.1寻找注入点
进行一些简单的测试,发现都无法成功
查看后端代码发现,后端代码对我们输入的登录用户名和密码进行了过滤,因此无法注入
function sqllogin(){
$username = mysql_real_escape_string($_POST["login_user"]); //过滤了单双引号
$password = mysql_real_escape_string($_POST["login_password"]);//过滤了单双引号
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
//print_r($row) ;
if ($row[1]) {
return $row[1];
} else {
return 0;
}
}
但是发现pass_change.php文件中,修改密码时,当从数据库中找出所修改的用户的密码时,没有对username进行过滤,导致出现二次注入点。
if (isset($_POST['submit']))
{
# 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>';
我们是否可以先注册一个类似admin'#的用户,然后当对admin‘#用户进行修改密码时来进行注入呢?话不多说,直接开干
2.2注册admin'#用户
发现可以注册,与我们设想的一样
然后进行登录
顺利登录,此时页面显示YOU ARE LOGGED IN AS admin'#
2.3修改密码
根据pass_change.php文件的代码分析,current password可以随便填写,只要New Password等于Retype Password,程序就会进入if语句中,sql语句就会生效
if (isset($_POST['submit']))
{
# 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>';
此时我们将修改的密码进行提交后,admin'#进入sql语句中,上述sql语句就会变为
$sql = "UPDATE users SET PASSWORD='$pass' where username='$admin'#' and password='$curr_pass' ";
标红的地方就会被注释掉,就会成功修改admin的密码
此时我们使用admin用户进行登录,测试admin的密码是否被修改
可以见到,我们确实用admin用户成功登录,在这之前我们是不知道admin用户的密码的
这就是sql二次注入,可以利用它来修改任意用户的密码,所以危害是比较大的