靶场的搭建
建议在虚拟机里进行靶场的搭建,安全、隔离、可恢复,不会影响真正系统。我将使用vmware-kali来搭建靶场
Kali环境下SQLi Labs靶场部署全流程总结
1. 安装Kali环境及LAMP组件
建议使用VMware或VirtualBox新建Kali虚拟机。
安装Web服务与SQL支持:
sudo apt update
sudo apt install apache2 mariadb-server php php-mysql git unzip
2. 克隆SQLi Labs靶场源码
进入Web根目录(Apache默认):
cd /var/www/html
sudo git clone https://github.com/Audi-1/sqli-labs.git
sudo chown -R www-data:www-data sqli-labs
3. 启动服务
确保apache和数据库开启:
sudo systemctl start apache2
sudo systemctl start mariadb
sudo systemctl enable apache2
sudo systemctl enable mariadb
4. 创建数据库和导入数据
登录MariaDB/MySQL,创建数据库:
sudo mysql -u root
CREATE DATABASE security;
exit;
导入表数据(最新版SQLi Labs用sql-lab.sql):
sudo mysql -u root security < /var/www/html/sqli-labs/sql-lab.sql
5. 检查/修改数据库连接配置
查看连接文件:
/var/www/html/sqli-labs/sql-connections/db-creds.inc.php
常见参数如下:
(这里要把你实际的数据库user和password写进去)
$dbuser ='root';
$dbpass ='';
$dbname ="security";
$host = 'localhost';
6. 重启服务并测试浏览
重启Apache以确保配置生效:
sudo systemctl restart apache2
用浏览器访问靶场首页:
http://localhost/sqli-labs/
7. 局域网访问(Windows主机互通)
-
Kali虚拟机网络模式用桥接或主机仅。
-
Kali查IP命令:
ip a -
Windows浏览器输入 Kali 的IP访问:(比如说192.168.26.128)
http://192.168.26.128/sqli-labs/
8. 常见问题处理
-
若页面报错,优先检查数据库服务和连接配置无误。
-
权限不足可用:
sudo chown -R www-data:www-data /var/www/html/sqli-labs -
IP变动,重新查当前虚拟机IP再访问。
-
如靶场实验练废,建议用虚拟机快照恢复环境。
1. 安装和初始化数据库
问题现象:
- 页面提示“Unable to connect to database”或空白
- 没初始化 security 数据库
解决办法:
-
用 MariaDB 终端手动创建数据库并导入建表 SQL 脚本
-
例:
mysql -u admin -p CREATE DATABASE security; USE security; SOURCE /var/www/html/sqli-labs-master/sql-connections/setup-db.sql; -
编写好 db-creds.inc,用户名、密码跟本地数据库账号一致
2. 数据库连接报错
常见报错:
Access denied for user ...Unknown database ...mysqli_connect(): (HY000/1045)...或类似的连接失败
排查方法:
-
在MariaDB中执行:
SELECT user, host FROM mysql.user; SHOW DATABASES; USE security; SHOW TABLES; -
保证用户和数据库名一样
-
如果用的是 admin 账户,确保密码一致,且有足够权限
3. 页面无响应或空白
问题现象:
- 页面一片白
- 没有任何提示,也不报错
排查方法:
-
打开 PHP 错误显示:在顶部添加
error_reporting(E_ALL); ini_set('display_errors', 1); -
刷新页面,获取详细错误信息
-
检查配置文件路径和引用是否正确
4. mysql_* 系列函数无效(最常见问题,传入id无反应)
问题描述:
- 报错
Call to undefined function mysql_connect()或mysql_query未定义 - 原因:PHP7/8 已移除所有 mysql_* API,只支持 mysqli 或 PDO
典型报错:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in .../sql-connections/sql-connect.php
解决办法:
-
把数据库连接相关代码从
$con = mysql_connect($host, $dbuser, $dbpass); mysql_select_db($dbname, $con);改成:
$con = mysqli_connect($host, $dbuser, $dbpass, $dbname); if (!$con) { die("Failed to connect to MySQL: " . mysqli_connect_error()); } -
数据查询部分所有
mysql_query($sql)→mysqli_query($con, $sql)mysql_fetch_array($result)→mysqli_fetch_array($result)mysql_error()→mysqli_error($con)- 保证
$con变量正确传递
所有靶场关卡页面都需要这样修改,否则会一直报函数未定义错误。
5. 修改与迁移建议
- 推荐批量替换所有 mysql_* 为 mysqli_*,节约手动成本
- 新建一份备份后,用自动化脚本或命令行处理
- 个别复杂页面再人工微调
6. 批量替换技巧
Linux下批量替换:
find 路径 -type f -name "*.php" -exec sed -i 's/mysql_query(\(.*\))/mysqli_query($con, \1)/g' {} \;
find 路径 -type f -name "*.php" -exec sed -i 's/mysql_fetch_array/mysqli_fetch_array/g' {} \;
find 路径 -type f -name "*.php" -exec sed -i 's/mysql_error()/mysqli_error($con)/g' {} \;
路径通常为
/var/www/html/sqli-labs
- 替换后需人工快速检查,极个别页面手工微调语法即可。
- 建议先备份项目,防止误操作。
7. 总结建议
- MariaDB 与 MySQL 基本操作一致,各种 SQL 语法都可以直接用
- 数据库用户、库名、密码要与配置文件内容保持一致
- PHP7及以上环境部署 sqli-labs 务必把所有数据库操作 API 升级为 mysqli 或 PDO
- 批量自动化替换最省事,GitHub上也可直接寻找兼容新环境的 sqli-labs 分支或 fork
- 有错误多查看报错内容,开启 error_reporting,便于排查
- 遇到个别页面无法正常访问时,结合 SQL 控制台查询和页面调试双管齐下
- MariaDB可兼容mysql,前者是mysql团队部分成员为了不受 Oracle 控制做的分支。
- 文章内使用命令行的部分可以使用phpmyadmin等可视化工具代替
- 一切正常之后,进入Less - 1,不应该只有Welcome Dhakkan
Comments