从零搭建Sqli-labs靶场:手把手教你构建SQL注入实战环境

📅 2026/7/6 11:34:13 👁️ 阅读次数 📝 编程学习
从零搭建Sqli-labs靶场:手把手教你构建SQL注入实战环境

1. 项目概述:为什么我们需要一个SQL注入靶场?

如果你刚开始接触Web安全,或者想从理论转向实战,那么“SQL注入”这个词你一定不陌生。它是Web安全领域最经典、最普遍的漏洞之一,也是渗透测试工程师的必修课。但理论学习之后,最大的困惑往往是:我该去哪里练手?总不能直接拿别人的网站开刀吧?这时候,一个安全、可控、专门用于练习的“靶场”就至关重要了。

Sqli-labs正是这样一个靶场。它不是一款攻击工具,而是一个精心设计的、包含大量SQL注入漏洞的PHP应用程序。你可以把它安装在自己的电脑或虚拟机里,然后像黑客一样,尝试用各种技术去“攻破”它,而不用担心任何法律风险。通过它,你能从最基础的报错注入,一路练到复杂的盲注、堆叠注入,甚至绕过各种WAF(Web应用防火墙)规则。网络上流传的“sqli-labs通关”攻略,指的就是攻克这个靶场设置的所有关卡。

我见过很多新手,一上来就找各种工具和脚本,结果连最基本的注入原理都没搞懂。安装并亲手打通Sqli-labs,是建立SQL注入系统性认知最扎实的一步。它让你从“看懂了”进化到“会用了”。接下来,我就以一个老手的视角,带你从零开始,在本地搭建这个经典的渗透测试训练场,并分享一些官方教程里不会写的细节和坑。

2. 环境准备:搭建你的专属“黑客实验室”

在安装Sqli-labs之前,我们需要先准备好它赖以生存的土壤——一个完整的Web服务环境。对于PHP+MySQL的应用,最经典的组合就是LAMP(Linux + Apache + MySQL + PHP)或WAMP(Windows版)。为了让环境更干净、更易于管理,我强烈建议使用虚拟机。这也是为什么“vmware安装教程”、“kali linux渗透测试系列”会成为相关热词的原因。

2.1 操作系统与虚拟化平台选择

虽然你可以在Windows上直接安装WAMP套件来运行Sqli-labs,但我更推荐在虚拟机里安装一个Linux系统,比如Ubuntu或Kali Linux。这样做有几个好处:

  1. 环境隔离:所有实验操作都在沙箱里,不会影响宿主机的稳定性,卸载也方便。
  2. 贴近实战:很多服务器运行在Linux环境下,提前熟悉Linux命令和配置对后续学习至关重要。
  3. 工具链完整:像Kali Linux这样的渗透测试专用系统,内置了sqlmap、Burp Suite等所有你可能用到的工具,省去大量配置时间。

我的选择与理由:对于纯粹的学习靶场,我推荐使用Ubuntu Server 20.04 LTS。它稳定、轻量,没有图形界面能让你更专注于命令行操作。虚拟机软件则用VMware Workstation Player(免费版即可)或 VirtualBox。如果你已经按照“kali linux渗透测试系列”安装了Kali,那直接用它作为基础环境也完全没问题。

2.2 核心服务安装:Apache、MySQL与PHP

无论你选择哪个Linux发行版,安装核心服务的命令大同小异。我们以Ubuntu为例,使用apt包管理器。

首先,更新软件包列表:

sudo apt update

然后,安装Apache网页服务器、MySQL数据库和PHP及其相关模块。这里有个关键点:Sqli-labs是一个较老的项目,它对PHP版本有一定要求。经过实测,PHP 7.x系列兼容性较好,而PHP 8.x可能会遇到一些函数弃用或语法兼容性问题。

因此,我们安装PHP 7.4(一个广泛使用的稳定版本):

sudo apt install apache2 mysql-server php7.4 libapache2-mod-php7.4 php7.4-mysql

这条命令一次性安装了:

  • apache2: Web服务器。
  • mysql-server: 数据库服务。
  • php7.4: PHP解释器核心。
  • libapache2-mod-php7.4: 让Apache能够解析PHP文件的模块。
  • php7.4-mysql: PHP连接MySQL数据库的扩展(这个至关重要,没有它Sqli-labs无法连接数据库)。

安装过程中,MySQL会提示你设置root用户的密码。请务必记住这个密码,后面配置Sqli-labs时会用到。

注意:如果你使用的是Kali Linux,默认可能已经安装了Apache和PHP,但MySQL可能被MariaDB替代。安装命令可能是sudo apt install mariadb-server php mariadb-client。原理相通,只是软件包名称不同。

安装完成后,启动服务并设置开机自启:

sudo systemctl start apache2 sudo systemctl start mysql sudo systemctl enable apache2 sudo systemctl enable mysql

现在,你可以在宿主机的浏览器里访问http://[你的虚拟机IP地址],如果看到Apache的默认欢迎页面,说明Web服务运行正常。

2.3 环境验证与常见问题排查

环境装好了,但不一定完全“健康”。我们需要做几个快速检查:

1. 检查PHP是否正常工作:创建一个测试文件:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/test.php

然后访问http://[虚拟机IP]/test.php。你应该能看到一个详细的PHP配置信息页面。如果显示空白或代码本身,说明PHP模块没有正确加载。你需要检查Apache的PHP模块是否启用:sudo a2enmod php7.4,然后重启Apache:sudo systemctl restart apache2

2. 检查MySQL服务状态:

sudo systemctl status mysql

确保状态是active (running)。你可以尝试登录MySQL:

sudo mysql -u root -p

输入你之前设置的密码,如果能进入MySQL命令行(提示符变为mysql>),说明数据库服务正常。

3. 防火墙问题(如果无法访问):Ubuntu默认的防火墙工具是ufw。确保它允许HTTP(80端口)流量:

sudo ufw allow 'Apache' sudo ufw status # 查看规则是否生效

3. 获取与部署Sqli-labs源码

环境就绪,主角该上场了。Sqli-labs是一个开源项目,托管在GitHub上。这里我们有两种获取方式:通过git克隆(推荐)或直接下载ZIP包。考虑到“git安装教程”也是热门搜索,我们就用git方式,这更符合开发者习惯,也便于后续更新。

3.1 使用Git克隆项目

首先,确保系统安装了git:

sudo apt install git -y

然后,选择一个合适的目录。通常,Web应用的源码放在/var/www/html/下,这是Apache的默认根目录。我们为Sqli-labs单独创建一个文件夹:

cd /var/www/html/ sudo git clone https://github.com/Audi-1/sqli-labs.git

克隆完成后,你会看到一个名为sqli-labs的文件夹。里面的sqli-labs子文件夹才是真正的应用目录。为了访问方便,我们可以做个软链接或者直接移动。我习惯直接将其内容移动到html根目录下的一个明确路径:

sudo mv sqli-labs/sqli-labs /var/www/html/sqli-labs-app

现在,我们的靶场应用路径是/var/www/html/sqli-labs-app

3.2 目录结构与权限设置

进入应用目录,查看结构:

cd /var/www/html/sqli-labs-app ls -la

你会看到很多文件夹,如Less-1,Less-2... 这些就是不同的关卡。还有一个重要的文件sql-connections文件夹,里面存放数据库连接配置。

关键一步:设置正确的文件权限。Apache服务器进程(通常以www-data用户运行)需要能够读取这些文件。权限过松(777)不安全,过紧(默认可能只有root可写)会导致应用无法创建必要的文件(如session)。

sudo chown -R www-data:www-data /var/www/html/sqli-labs-app sudo find /var/www/html/sqli-labs-app -type d -exec chmod 755 {} \; sudo find /var/www/html/sqli-labs-app -type f -exec chmod 644 {} \;

这条命令将目录的所有者改为www-data,并设置目录为755(所有者可读写执行,其他人可读执行),文件为644(所有者可读写,其他人只读)。这是一个兼顾安全与功能的常见设置。

4. 数据库配置与靶场初始化

Sqli-labs的所有关卡数据都存储在MySQL数据库中。因此,我们需要为它创建一个专用的数据库和用户。

4.1 创建数据库与用户

登录MySQL:

sudo mysql -u root -p

在MySQL命令行中,依次执行以下SQL语句:

-- 创建一个名为 `security` 的数据库,这是Sqli-labs默认使用的库名 CREATE DATABASE security; -- 创建一个用户,用户名和密码都设为 `security`(方便记忆,实际环境中应用强密码) CREATE USER 'security'@'localhost' IDENTIFIED BY 'security'; -- 授予这个用户对 `security` 数据库的所有权限 GRANT ALL PRIVILEGES ON security.* TO 'security'@'localhost'; -- 使权限生效 FLUSH PRIVILEGES; -- 退出MySQL EXIT;

4.2 修改数据库连接配置

现在,我们需要告诉Sqli-labs应用如何连接到刚创建的数据库。配置文件位于:

/var/www/html/sqli-labs-app/sql-connections/db-creds.inc

用文本编辑器(如nano)打开它:

sudo nano /var/www/html/sqli-labs-app/sql-connections/db-creds.inc

你会看到类似以下内容:

<?php //give your mysql connection username n password $dbuser ='root'; $dbpass =''; $dbname ="security"; $host = 'localhost'; $dbname1 = "challenges"; ?>

将其修改为我们刚才创建的用户信息:

<?php $dbuser ='security'; // 修改为 'security' $dbpass ='security'; // 修改为 'security' $dbname ="security"; $host = 'localhost'; $dbname1 = "challenges"; ?>

保存并退出(在nano中按Ctrl+X,然后按Y,再按Enter)。

4.3 初始化数据库数据

Sqli-labs提供了一个方便的脚本来创建数据表并填充初始数据。在浏览器中访问:

http://[你的虚拟机IP]/sqli-labs-app/setup-db.php

这个页面会引导你完成数据库的初始化。通常,你只需要点击一个链接或按钮,比如“Setup/reset Database for labs”。脚本会自动执行以下操作:

  1. 连接到security数据库。
  2. 创建users等数据表。
  3. 向表中插入练习用的数据(如用户Dumb, Angelina等)。

如果页面显示成功信息,或者没有报错,并出现了指向各个关卡(Less-1, Less-2...)的链接,那么恭喜你,数据库初始化就完成了。

实操心得:有时点击 setup 按钮后页面会空白或报错。别慌,首先检查上一步的db-creds.inc配置文件中的密码是否正确。其次,可以手动执行SQL文件。在源码目录下找到sql-lab.sql文件,用MySQL命令导入:sudo mysql -u security -p security < /var/www/html/sqli-labs-app/sql-lab.sql。这种方法往往更直接有效。

5. 访问靶场与基础关卡初探

完成以上所有步骤后,你的个人SQL注入训练营就正式开张了。在浏览器访问:

http://[你的虚拟机IP]/sqli-labs-app/

你应该能看到Sqli-labs的首页,上面列出了所有的关卡(Less-1 到 Less-?)。点击“Less-1: Error Based - Single quotes - String”,就进入了第一关。

5.1 第一关实战体验与原理分析

第一关通常是基于错误的字符型注入。页面可能有一个输入框让你输入User ID。如果你输入1并提交,页面会返回一个用户信息。

尝试注入:在输入框尝试输入1'(数字1加一个单引号)。如果页面返回了数据库错误信息(如“You have an error in your SQL syntax...”),那么漏洞就存在了。这是因为后端代码可能这样拼接SQL语句:

$id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";

当你输入1'时,SQL语句变成了SELECT * FROM users WHERE id='1'' LIMIT 0,1,单引号不匹配导致语法错误。这就是经典的“基于错误的SQL注入”,漏洞利用的第一步就是确认注入点

进一步利用:基于这个错误,我们可以构造更复杂的Payload来获取信息。例如,输入:

1' order by 3 --+

order by 3是用于猜测查询结果列数的,--+是注释符,用于注释掉原SQL语句中后面的单引号和LIMIT等部分,避免语法错误。如果页面正常返回,说明查询结果至少有3列。通过不断调整数字,直到报错,就能确定列数。这是手工注入的标准流程之一。

5.2 靶场关卡设计逻辑解读

Sqli-labs的关卡设计是循序渐进的:

  • Less-1 ~ Less-4:分别涵盖了单引号、双引号、括号等不同闭合方式的字符型/整数型错误注入。
  • Less-5 ~ Less-6:引入了布尔盲注和延时盲注。页面不再显示数据库错误,只返回“You are in...”或空白。你需要通过页面返回的真假(布尔)或响应时间(延时)来推断数据。
  • Less-7 ~ 更高关卡:难度逐渐提升,包括导出文件注入、堆叠查询注入、二次注入、WAF绕过等高级主题。

这种设计迫使你不能只依赖一种工具或一种方法,必须深刻理解SQL语句的构造和数据库的特性。

6. 进阶工具链集成:让测试如虎添翼

手工注入是理解原理的根本,但在实战和高效学习中,工具必不可少。在你的靶场环境中集成以下工具,学习效率会倍增。

6.1 浏览器插件:HackBar

对于初学者,手工构造Payload很繁琐。HackBar这类浏览器插件(适用于Firefox或Chrome的同类插件)可以极大地简化这个过程。它允许你直接在浏览器中编辑URL参数、POST数据,快速添加常见的SQL注入测试语句、编码解码等。在练习Sqli-labs前20关时,用HackBar配合手工测试,能帮你快速找到感觉。

6.2 代理工具:Burp Suite

Burp Suite是Web安全测试的“瑞士军刀”。它的核心功能是拦截、查看和修改浏览器与服务器之间的所有HTTP/HTTPS流量。

  1. 在虚拟机或宿主机上启动Burp Suite。
  2. 将浏览器的代理设置为127.0.0.1:8080(Burp默认监听端口)。
  3. 访问Sqli-labs关卡,Burp会截获你的请求。
  4. 你可以将请求发送到Repeater模块,在那里随意修改参数(比如id的值),反复发送并观察响应,无需在浏览器里来回刷新。这对于调试复杂的盲注Payload极其有用。
  5. 更强大的Intruder模块可以用于自动化爆破,比如猜解数据库名、表名、列名。

将Sqli-labs与Burp Suite结合,是你从“做题”转向“实战思维”的关键一步。

6.3 自动化神器:SQLMap

当手工理解了注入原理后,可以使用sqlmap进行自动化检测和利用。这是一个用Python写的开源工具,功能极其强大。你可以在Kali Linux中直接使用,如果在Ubuntu上,可以安装:

sudo apt install sqlmap -y

基本使用示例:假设Less-1的URL是http://192.168.1.100/sqli-labs-app/Less-1/?id=1

sqlmap -u "http://192.168.1.100/sqli-labs-app/Less-1/?id=1" --batch

--batch参数会让sqlmap以非交互模式运行,自动选择默认选项。sqlmap会先检测是否存在注入点,然后你可以通过附加参数让它列举数据库(--dbs)、列举表(-D security --tables)、甚至直接dump数据(-D security -T users --dump)。

重要警告:sqlmap是强大的攻击工具,仅限在自己的靶场或获得明确授权的测试中使用。用它扫描或攻击未经授权的系统是违法行为。

7. 安装与配置过程中的疑难杂症实录

即使按照步骤操作,你也可能会遇到一些坑。下面是我在多次安装和教学过程中总结的常见问题及解决方案。

7.1 数据库连接失败

问题描述:访问setup-db.php或点击关卡时,页面显示“数据库连接错误”。排查思路

  1. 检查MySQL服务sudo systemctl status mysql,确保它是运行状态。
  2. 检查配置文件中密码:再次确认db-creds.inc文件中的$dbpass是否与MySQL中为security用户设置的密码完全一致(注意大小写和特殊字符)。
  3. 检查用户权限:登录MySQL,执行SHOW GRANTS FOR 'security'@'localhost';,确认用户对security数据库有所有权限。
  4. 检查MySQL的认证插件:MySQL 8.0+ 默认使用caching_sha2_password认证插件,一些老的PHP驱动可能不支持。可以尝试将用户认证方式改回旧的mysql_native_password
    ALTER USER 'security'@'localhost' IDENTIFIED WITH mysql_native_password BY 'security'; FLUSH PRIVILEGES;

7.2 页面显示PHP代码或空白页

问题描述:访问.php文件时,浏览器直接显示代码文本,或者一片空白。原因与解决

  • 显示代码:Apache没有正确解析PHP。确保安装了libapache2-mod-php7.4并已启用:sudo a2enmod php7.4,然后重启Apache:sudo systemctl restart apache2。同时检查文件是否以.php结尾。
  • 空白页:通常是PHP代码有语法错误或致命错误,但错误显示被关闭。修改PHP配置以显示错误有助于调试。编辑/etc/php/7.4/apache2/php.ini,找到:
    display_errors = Off error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    改为:
    display_errors = On error_reporting = E_ALL
    保存后重启Apache。这样错误信息就会打印在页面上,方便定位问题。

7.3 点击Setup页面无反应或报错

问题描述:点击“Setup/reset Database”链接后,页面没有成功提示,或者提示SQL执行错误。解决方案

  1. 手动执行SQL文件:这是最可靠的方法。找到sqli-labs-app/sql-lab.sql文件,在终端执行:
    sudo mysql -u security -p security < /path/to/sqli-labs-app/sql-lab.sql
    系统会提示输入security用户的密码。
  2. 检查SQL文件路径:确保命令中的文件路径正确。
  3. 检查数据库是否已存在:如果之前安装失败,可能残留了旧的security数据库。可以先登录MySQL执行DROP DATABASE security;,然后重新创建数据库和用户,再导入SQL。

7.4 关卡页面无法提交或跳转

问题描述:在关卡页面输入内容点击提交后,页面没有变化或跳转到首页。可能原因

  1. PHP Session问题:Sqli-labs使用Session来跟踪一些状态。确保/var/www/html/sqli-labs-app目录及其子目录对www-data用户有写权限(我们之前用chown命令已经设置过)。也可以检查/tmp目录的权限。
  2. JavaScript被禁用:部分页面功能可能依赖简单的JS,确保浏览器没有禁用JS。

8. 从靶场到实战:学习路径与资源建议

成功安装Sqli-labs只是第一步,更重要的是如何有效地利用它。这里分享一条我建议的学习路径:

第一阶段:手工通关(Less-1 至 Less-22)

  • 目标:不借助sqlmap,完全手工注入。
  • 方法:每个关卡,先尝试判断注入类型(字符型/数字型)、闭合方式。使用union select结合order by猜解列数,然后替换查询字段,获取数据库版本、当前数据库名、表名、列名,最后提取数据。
  • 核心技能:掌握union,select,concat(),group_concat(),information_schema数据库的用法,理解and 1=1/and 1=2在布尔盲注中的作用,掌握sleep()在时间盲注中的应用。
  • 辅助工具:主要使用HackBar和Burp Suite Repeater辅助Payload构造和调试。

第二阶段:工具辅助,深化理解

  • 目标:用手工理清注入点后,使用sqlmap进行自动化利用,并对比分析sqlmap使用的Payload。
  • 方法:手工找到一个有效的注入Payload后,用sqlmap的-u参数扫描同一URL。使用-v 3或更高等级查看详细Payload。思考为什么sqlmap要这么构造,学习它绕过技巧的思维。
  • 核心技能:看懂sqlmap的输出日志,理解其工作流程(测试参数、识别DBMS、枚举信息)。

第三阶段:源码审计与漏洞修复

  • 目标:知其然,更要知其所以然。
  • 方法:打开Sqli-labs对应关卡的PHP源码(在Less-*目录下的index.php或相关文件)。看它是如何拼接SQL语句的,漏洞代码在哪里。然后尝试思考如何修复——是用预编译语句(PDO/mysqli_prepare)?还是输入过滤?并动手修改代码,验证修复是否有效。
  • 核心技能:从攻击者思维切换到防御者思维,这是成为安全工程师的关键。

延伸资源

  • 书籍:除了网络攻略,《SQL注入攻击与防御》《白帽子讲Web安全》都是很好的系统学习资料。
  • 其他靶场:在通关Sqli-labs后,可以挑战更综合的靶场,如DVWA、WebGoat、PentesterLab等,它们涵盖了SQL注入以外的更多漏洞类型。
  • 社区:遇到卡关时,善用搜索引擎和GitHub上的Issues讨论区。但切记,先独立思考,再看答案。

安装Sqli-labs靶场,就像为自己搭建了一个永不疲倦的陪练。它安全、免费,且充满挑战。在这个沙盒里,你可以大胆尝试所有在真实世界中危险且非法的操作,将书本上的SQL语法知识,转化为实实在在的漏洞挖掘与利用能力。这个过程可能会遇到各种报错和挫折,但每一次排错、每一次成功注入,都是你技能树上扎实的一环。记住,工具和环境只是起点,持续的好奇心、动手实践和举一反三的思考,才是你在安全道路上走得更远的核心动力。现在,打开你的第一关,开始你的注入之旅吧。