通过sqli-labs-Less24学习sql二次注入

Less24介绍

我是通过sqli-labs的Less24场景学习的sql二次注入。首先介绍一下Less24的场景。

首先是一个登录界面,通过查看代码发现在登录处使用了mysql_real_escape_string函数对输入进行了转义。转义字符如下。

1
2
3
4
5
6
7
\x00
\n
\r
\
'
"
\x1a

我还专门去查了这个函数的绕过方式,企图直接绕过。可惜,只能在查询语句中变量出是整型才能绕过。而本题登录处的查询语句使用了单引号,而该函数转义了单引号,所以不存在注入。

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

另外还有个功能是注册新用户,关键代码如下。这里的用户名和密码也用了mysql_escape_string转义。但其实在插入数据库时并不会将转义字符也一起插入。比如单引号,经过该函数转义后会变为\',但在插入数据库时又会变为',不会将斜杠也插入数据库。

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

注册完新用户后还有一个修改密码的功能,关键代码如下

1
2
3
4
$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

二次注入流程

首先,需要有一个注册新用户的功能,将用户提交的数据存入数据库。且没有对用户提交的数据做任何检查。

其次,在其他功能点使用了这项数据,在使用前也没有对数据库中的数据做任何检查。如果用户提交的数据中包含了恶意代码,从而导致了恶意代码的执行。

在Less-24的场景下,本身用户登录处是没有注入漏洞的。但是在注册新用户的功能点,会将用户提交的用户名存入数据库,并且没有做任何恶意代码检查。接下来在修改密码这个功能点,直接引用了数据库中的username字段,导致了用户提交的恶意的sql语句的执行。

也就是说,整个过程中第一次提交的时候是不触发sql注入,而在第二次调用的过程中才触发的sql注入。

Less24实验通关

那么我们知道了触发注入的点在update语句上,我们可以通过这个语句在不知道管理员密码的情况下修改管理员的密码,payload如下:

admin’#

带入sql语句中就变成了

$sql = “UPDATE users SET PASSWORD=’$pass’ where username=’admin’#’ and password=’$curr_pass’ “;

井号#后面的语句被注释,就变成了

$sql = “UPDATE users SET PASSWORD=’$pass’ where username=’admin’

此时admin当前的密码已经变得无关紧要,直接就能修改了管理员admin的密码

image-20220425152604883

image-20220425152325468

通过数据库可以看到admin的密码已经成功被修改为“hacked”

image-20220425152736603


通过sqli-labs-Less24学习sql二次注入
https://wanf3ng.github.io/2022/04/25/通过sqli-labs-Less24学习sql二次注入/
作者
wanf3ng
发布于
2022年4月25日
许可协议