靶场的搭建

建议在虚拟机里进行靶场的搭建,安全、隔离、可恢复,不会影响真正系统。我将使用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. 页面无响应或空白

问题现象:

  • 页面一片白
  • 没有任何提示,也不报错

排查方法:

  1. 打开 PHP 错误显示:在顶部添加

    error_reporting(E_ALL); ini_set('display_errors', 1);
    
  2. 刷新页面,获取详细错误信息

  3. 检查配置文件路径和引用是否正确


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