二次注入

简介

二次注入是sql注入的一种,与通常的一次注入直接输入变量值通过查询进行注入不同的是,二次注入需要读取数据库中已有的数据,进行注入,所以二次注入的隐蔽性更高,但可利用性更低。
基本流程参考:

sqli-labs 24 示例

登录页面的代码

$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'";

登录页面的输入的非法字符都经过了转义

然后看下注册页面的代码

$username=  mysql_escape_string($_POST['username']) ;
$pass= mysql_escape_string($_POST['password']);
$re_pass= mysql_escape_string($_POST['re_password']);
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";

输入的用户名和密码经过了 mysql_escape_string 函数的转义,但是在此若注册一个用户名为 admin’# 的账户,虽然经过了转义,但存储到数据库中之后依然保留了 ‘#

然后用注册的账户进行登录,更改密码页面的源码

1
2
3
4
5
$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']);
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

这里我们进行更改密码,输入我们的用户名,admin’#,最后得到的sql语句是这样的

1
UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass';

所以这里最后更改的是用户 admin 的密码

admin 账户的密码由原来的 admin 被改为了 aaaa

参考:https://www.freebuf.com/articles/web/167089.html