0x01 什么
所谓二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入
到 SQL 查询。
0x02 原理
在第一次对数据进行插入
时 ,只是借入 addslashes
,get_magic_quotes_gpc
,mysql_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.