0x01 什么

所谓二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。

二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。

0x02 原理

在第一次对数据进行插入时 ,只是借入 addslashesget_magic_quotes_gpcmysql_real_escape_string 等 转义函数,插入数据本身没有改变 仍然是 危险数据

再下次调用是 拼凑直接触发漏洞

0x03 演示

SQLIlab lesson-24

源码

function sqllogin(){

   $username = mysqli_real_escape_string($con, $_POST["login_user"]);
   $password = mysqli_real_escape_string($con, $_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 = mysqli_query($con, $sql) or die('You tried to be real smart, Try harder!!!! :( ');
   $row = mysqli_fetch_row($con, $res);
	//print_r($row) ;
   if ($row[1]) {
			return $row[1];
   } else {
      		return 0;
   }

}
// login_create.php
$username=  mysqli_escape_string($con, $_POST['username']) ;
$pass= mysqli_escape_string($con, $_POST['password']);

对username password 本身仅仅只是转义了 mysqli_real_escape_string ,插入到数据库本身就是一个恶意数据

注册一个恶意的账号 admin'# 
登录成功后修改账号密码间接修改admin
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";
admin 就会被我们成功修改成我们的密码

0x04 参考

1、由Three Hit聊聊二次注入 - FreeBuf网络安全行业门户

Q.E.D.