1. 靶场环境搭建的整体思路与选型逻辑
搞安全技术研究的人,手头没几套顺手的靶场环境,就像厨师没有趁手的刀。DVWA、MCIR、Pikachu、Mutillidae、BWAPP这五个靶机,基本覆盖了Web安全入门到进阶的绝大多数场景。我最早接触这些靶场的时候,一个个手动装,踩了不少坑,后来才慢慢摸索出一套比较顺的搭建流程。
这五个靶机各有侧重,不是随便凑在一起的。DVWA适合练基础漏洞的手感,Pikachu是中文环境下最友好的综合练习平台,BWAPP的漏洞覆盖面最广,Mutillidae偏向OWASP Top 10的系统性训练,MCIR则是一个比较特殊的SQL注入专项训练场。把它们放在一起,基本上从新手到中级安全研究者需要的练习场景就齐了。
搭建方式上,我强烈建议用虚拟机+集成环境的方案,而不是在物理机上直接装。原因很简单:这些靶场本身就是为了让你练习攻击的,里面全是漏洞,放在物理机上等于给自己埋雷。用虚拟机隔离,练完了直接回滚快照,干净利落。集成环境方面,XAMPP或者phpStudy都可以,我个人更倾向XAMPP,跨平台做得好,配置透明,出问题好排查。
还有一个关键决策是数据库的选择。这五个靶机里,DVWA、Pikachu、Mutillidae、BWAPP都支持MySQL,MCIR也是基于MySQL的。所以统一用MySQL/MariaDB就行,不用折腾多数据库。PHP版本建议用7.x系列,兼容性最好,PHP 8对某些老靶场会有兼容问题,这个后面会细说。
提示:搭建之前先确认虚拟机的网络模式。NAT模式最省事,宿主机能访问靶场就行,不需要靶场访问外网。如果要用Burp Suite抓包,记得把代理配置好。
2. 基础环境准备与核心组件安装
2.1 虚拟机与操作系统的选择
虚拟机软件用VMware Workstation或者VirtualBox都行,看个人习惯。操作系统我推荐Ubuntu Server 20.04 LTS或者Debian 11,这两个版本稳定,软件源里的PHP和MySQL版本也合适。如果你更习惯Windows环境,用Windows 10/11的虚拟机也可以,配合XAMPP搭建会更直观一些,但资源占用会高不少。
我自己的方案是Ubuntu Server 20.04,分配2核CPU、4GB内存、40GB硬盘。这个配置跑五个靶场绰绰有余,如果宿主机资源紧张,2GB内存也能跑起来,只是同时开多个靶场的时候会有点卡。硬盘建议给足,因为后面要装的东西不少,而且快照也会占空间。
系统装好之后,第一件事是更新软件源并安装基础工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget unzip git vim net-tools这几条命令下去,基础环境就差不多了。net-tools是为了后面用ifconfig查看IP地址,Ubuntu 20.04默认不带这个命令,得手动装。
2.2 Web服务器与数据库的安装配置
Apache和MySQL的安装一条命令搞定:
sudo apt install -y apache2 mysql-server php php-mysql php-gd php-xml php-mbstring php-curl php-zip这里要注意PHP扩展的完整性。php-mysql是必须的,没有它PHP连不上数据库;php-gd用于图形处理,DVWA的验证码功能需要;php-xml和php-mbstring是很多靶场框架的依赖;php-curl用于外部请求,BWAPP的部分功能会用到。
安装完成后,启动服务并设置开机自启:
sudo systemctl start apache2 sudo systemctl enable apache2 sudo systemctl start mysql sudo systemctl enable mysqlMySQL的安全初始化也要做一下,设置root密码,删除匿名用户:
sudo mysql_secure_installation按照提示一步步走就行,root密码设一个自己记得住的,后面配置靶场的时候要用。
2.3 PHP版本兼容性处理
这一步是很多人容易翻车的地方。Ubuntu 20.04默认的PHP版本是7.4,这个版本对五个靶场都兼容。但如果你用的是Ubuntu 22.04,默认PHP是8.1,DVWA和Pikachu可能会有报错。
检查PHP版本:
php -v如果版本是8.x,有两个选择:一是降级到7.4,二是修改靶场代码适配PHP 8。我建议降级,因为改代码太费时间,而且容易漏掉一些隐性的兼容问题。降级的方法:
sudo apt install -y software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt update sudo apt install -y php7.4 php7.4-mysql php7.4-gd php7.4-xml php7.4-mbstring php7.4-curl php7.4-zip sudo a2dismod php8.1 sudo a2enmod php7.4 sudo systemctl restart apache2这套操作下来,PHP就切到7.4了。验证一下:
php -v显示7.4.x就对了。
注意:切换PHP版本之后,Apache的模块也要对应切换,否则PHP文件会被当成普通文本下载,而不是解析执行。这个坑我踩过,排查了半天才发现是模块没切。
3. 五大靶机的逐一部署与配置
3.1 DVWA的部署与数据库初始化
DVWA的部署最简单,直接从GitHub拉代码:
cd /var/www/html sudo git clone https://github.com/digininja/DVWA.git dvwa sudo chown -R www-data:www-data dvwa sudo chmod -R 755 dvwa然后配置数据库连接。DVWA的配置文件在config目录下:
cd /var/www/html/dvwa/config sudo cp config.inc.php.dist config.inc.php sudo vim config.inc.php需要改的地方就几处:
$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = '你设置的root密码';保存退出后,在MySQL里创建数据库:
sudo mysql -u root -p CREATE DATABASE dvwa; exit;浏览器访问http://靶机IP/dvwa,会看到DVWA的欢迎页面。往下翻,点击"Create / Reset Database"按钮,数据库表就自动建好了。默认账号是admin,密码是password。
DVWA的安全级别默认是impossible,需要在"DVWA Security"页面改成low,不然很多漏洞练不了。这个设置存在session里,每次重新登录都要改一次,有点烦,但没办法。
3.2 Pikachu的部署与常见问题处理
Pikachu是国内团队做的一个综合靶场,中文界面,对新手很友好。部署方式也是拉代码:
cd /var/www/html sudo git clone https://github.com/zhuifengshaonianhanlu/pikachu.git sudo chown -R www-data:www-data pikachu sudo chmod -R 755 pikachuPikachu的数据库配置在inc/config.inc.php:
sudo vim /var/www/html/pikachu/inc/config.inc.php修改数据库连接信息:
define('DBHOST', '127.0.0.1'); define('DBUSER', 'root'); define('DBPW', '你设置的root密码'); define('DBNAME', 'pikachu');然后在MySQL里创建数据库并导入初始数据:
sudo mysql -u root -p CREATE DATABASE pikachu; exit; sudo mysql -u root -p pikachu < /var/www/html/pikachu/pikachu.sqlPikachu的安装页面在http://靶机IP/pikachu/install.php,访问一下确认安装成功。如果报错说数据库连接失败,检查一下config.inc.php里的密码有没有写对,以及MySQL是否允许root用户从本地连接。
Pikachu有一个比较特殊的地方:它的某些漏洞模块需要修改PHP配置才能正常触发。比如文件包含漏洞,需要确保allow_url_include是开启的:
sudo vim /etc/php/7.4/apache2/php.ini找到allow_url_include = Off改成On,然后重启Apache:
sudo systemctl restart apache2提示:
allow_url_include开启后会有安全风险,但靶场环境是隔离的,问题不大。练完之后如果要把环境做其他用途,记得改回来。
3.3 BWAPP的部署与配置要点
BWAPP(buggy Web Application)的漏洞数量是这几个靶场里最多的,超过100个漏洞点。部署方式:
cd /var/www/html sudo git clone https://github.com/rajeshar/bWAPP.git bwapp sudo chown -R www-data:www-data bwapp sudo chmod -R 755 bwappBWAPP的数据库配置在admin/settings.php文件里,但这个文件需要先通过Web界面访问才能修改。所以流程是这样的:
- 浏览器访问
http://靶机IP/bwapp/install.php - 点击"install"按钮
- 在数据库配置页面填入连接信息
如果install.php页面报错,可以手动修改配置文件:
sudo vim /var/www/html/bwapp/admin/settings.php修改以下几行:
$db_server = "127.0.0.1"; $db_username = "root"; $db_password = "你设置的root密码"; $db_name = "bwapp";然后手动创建数据库并导入数据:
sudo mysql -u root -p CREATE DATABASE bwapp; exit; sudo mysql -u root -p bwapp < /var/www/html/bwapp/db/bwapp.sqlBWAPP默认账号是bee/bug,登录后可以在界面里切换漏洞难度。BWAPP的界面比较老旧,但功能很全,适合系统性地过一遍Web漏洞。
3.4 Mutillidae的部署与数据库配置
Mutillidae是基于OWASP Top 10设计的靶场,它的特点是每个漏洞都有对应的提示和教程,适合边学边练。部署:
cd /var/www/html sudo git clone https://github.com/webpwnized/mutillidae.git mutillidae sudo chown -R www-data:www-data mutillidae sudo chmod -R 755 mutillidaeMutillidae的数据库配置在.htaccess文件里,这个文件是隐藏的,用ls -la才能看到:
cd /var/www/html/mutillidae sudo vim .htaccess找到数据库相关的配置项,修改为:
SetEnv DB_HOST 127.0.0.1 SetEnv DB_USER root SetEnv DB_PASSWORD 你设置的root密码 SetEnv DB_NAME mutillidae然后创建数据库并导入数据:
sudo mysql -u root -p CREATE DATABASE mutillidae; exit; sudo mysql -u root -p mutillidae < /var/www/html/mutillidae/database/mutillidae.sqlMutillidae的安装页面在http://靶机IP/mutillidae/set-up-database.php,访问一下确认数据库连接正常。Mutillidae有一个比较烦人的地方:它的某些功能依赖mod_rewrite模块,需要确保Apache开启了重写:
sudo a2enmod rewrite sudo systemctl restart apache23.5 MCIR的部署与特殊配置
MCIR(Magical Code Injection Rainbow)是一个专门用于练习代码注入的靶场,它的界面非常简陋,但功能很专注。MCIR的部署和其他几个不太一样,它需要单独配置虚拟主机。
先拉代码:
cd /var/www/html sudo git clone https://github.com/SpiderLabs/MCIR.git mcir sudo chown -R www-data:www-data mcir sudo chmod -R 755 mcirMCIR的数据库配置在每个子目录的includes/database.inc.php文件里。MCIR的结构比较特殊,它下面有多个子靶场,比如sqlol、xssmh、cryptomg等,每个都需要单独配置数据库连接。
以sqlol为例:
sudo vim /var/www/html/mcir/sqlol/includes/database.inc.php修改数据库连接信息:
$dbhost = '127.0.0.1'; $dbuser = 'root'; $dbpass = '你设置的root密码'; $dbname = 'sqlol';然后创建对应的数据库:
sudo mysql -u root -p CREATE DATABASE sqlol; exit;MCIR的sqlol模块需要导入初始数据:
sudo mysql -u root -p sqlol < /var/www/html/mcir/sqlol/includes/sqlol.sql其他子模块的配置方式类似,都是改database.inc.php然后建库导数据。MCIR的访问地址是http://靶机IP/mcir/sqlol/,每个子模块有独立的入口。
注意:MCIR的代码比较老,在PHP 7.4下可能会有Deprecated警告,但不影响功能。如果看到满屏警告觉得烦,可以在
php.ini里把error_reporting调低一点。
4. 常见问题排查与实战避坑经验
4.1 数据库连接失败的排查思路
数据库连接失败是搭建靶场时最常见的问题,表现就是页面报"Access denied"或者"Connection refused"。排查步骤我总结了一个顺序:
| 排查项 | 检查方法 | 常见原因 |
|---|---|---|
| MySQL服务状态 | sudo systemctl status mysql | 服务未启动 |
| 数据库是否存在 | sudo mysql -u root -p -e "SHOW DATABASES;" | 建库语句没执行 |
| 用户名密码是否正确 | 手动用mysql命令登录测试 | 配置文件里密码写错 |
| 连接地址是否正确 | 检查配置里是localhost还是127.0.0.1 | localhost走socket,127.0.0.1走TCP |
| 用户权限是否足够 | SELECT user,host FROM mysql.user; | root用户只允许localhost连接 |
其中最容易踩的坑是localhost和127.0.0.1的区别。在MySQL里,localhost走的是Unix socket,127.0.0.1走的是TCP。如果配置里写的是localhost但MySQL没有启用socket,就会连接失败。我的建议是统一用127.0.0.1,省得折腾。
还有一个坑是MySQL 8的认证插件。Ubuntu 20.04默认装的是MySQL 8,它默认用caching_sha2_password认证插件,而老版本的PHP MySQL扩展可能不支持。解决办法是改回mysql_native_password:
sudo mysql -u root -p ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; exit;4.2 权限问题与文件上传失败的处理
靶场目录的权限设置不对,会导致两种问题:一是PHP无法写入session文件,二是文件上传功能失败。
Apache默认以www-data用户运行,所以靶场目录的属主应该是www-data:
sudo chown -R www-data:www-data /var/www/html/ sudo chmod -R 755 /var/www/html/但有些目录需要写权限,比如DVWA的hackable/uploads目录、Pikachu的uploads目录:
sudo chmod -R 777 /var/www/html/dvwa/hackable/uploads sudo chmod -R 777 /var/www/html/pikachu/vul/unsafeupload/uploads提示:777权限在靶场环境里没问题,但生产环境绝对不能用。靶场本身就是用来练攻击的,权限放开一点反而方便。
如果文件上传还是失败,检查PHP配置里的上传限制:
sudo vim /etc/php/7.4/apache2/php.ini确认以下几项:
file_uploads = On upload_max_filesize = 20M post_max_size = 20M改完重启Apache生效。
4.3 跨靶场访问的端口与路径冲突
五个靶场都放在同一个Apache下,通过不同的路径访问,理论上不会冲突。但实际搭建过程中,我遇到过两个问题:
第一个是默认虚拟主机的配置。Apache默认的000-default.conf把/var/www/html作为根目录,所有靶场都在这个目录下,访问路径就是http://IP/dvwa、http://IP/pikachu这样。如果某个靶场的代码里用了绝对路径(比如/dvwa/includes/),可能会因为路径不对导致资源加载失败。解决办法是检查靶场的配置文件,把绝对路径改成相对路径,或者配置单独的虚拟主机。
第二个是端口冲突。如果宿主机上已经跑了其他Web服务占用了80端口,虚拟机的Apache就起不来。检查端口占用:
sudo netstat -tlnp | grep :80如果80端口被占用,可以改Apache的监听端口:
sudo vim /etc/apache2/ports.conf把Listen 80改成Listen 8080,然后访问的时候加上端口号http://IP:8080/dvwa。
4.4 靶场安全隔离与快照管理
这五个靶场全是漏洞,放在网络里就是一个活靶子。如果虚拟机用的是桥接模式,同网络下的其他设备都能访问到,风险很大。我的建议是:
- 虚拟机网络用NAT模式,只有宿主机能访问
- 如果必须用桥接,在Apache里配置访问控制,只允许特定IP访问
- 搭建完成后立即打快照,练废了直接回滚
快照管理有一个经验:不要只打一个快照。我的做法是打三个快照:一个是刚装完系统的干净状态,一个是装完所有靶场的初始状态,一个是配置好数据库和权限的可用状态。这样出问题的时候可以快速定位是哪一步出的错。
Apache的访问控制配置:
sudo vim /etc/apache2/apache2.conf在文件末尾添加:
<Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require ip 192.168.1.0/24 </Directory>这样只有192.168.1.0/24网段的设备能访问,其他IP会被拒绝。
5. 靶场使用技巧与进阶玩法
5.1 安全级别切换与漏洞触发条件
这五个靶场里,DVWA和BWAPP有安全级别切换功能,Pikachu和Mutillidae的漏洞是固定难度的,MCIR则完全看你怎么构造payload。
DVWA的安全级别在"DVWA Security"页面切换,有low、medium、high、impossible四档。low级别基本没有防护,medium加了一些简单的过滤,high级别的防护比较严格,impossible则是完全修复的版本。我的建议是每个漏洞都从low开始练,然后逐步提高级别,感受防护措施的变化。
BWAPP的安全级别在登录后的界面里切换,有low、medium、high三档。BWAPP的漏洞数量多,建议按照OWASP Top 10的分类逐个过一遍,不要跳着练。
Pikachu的漏洞难度是固定的,但它的每个漏洞模块都有详细的说明和提示,适合新手跟着教程一步步操作。Pikachu的特别之处在于它有很多组合漏洞的场景,比如XSS+CSRF组合利用,这个在实际渗透测试中很常见。
5.2 抓包工具与靶场的配合使用
练Web漏洞离不开抓包工具,Burp Suite是最常用的。配置方法:
- Burp Suite设置代理监听
127.0.0.1:8080 - 浏览器设置代理指向Burp Suite
- 访问靶场,Burp Suite就能抓到请求
如果靶场在虚拟机里,宿主机访问虚拟机的IP,Burp Suite装在宿主机上,代理配置要注意不要代理虚拟机IP。在浏览器的代理设置里,把虚拟机IP加到例外列表里,这样访问靶场的请求不经过Burp Suite,只有访问外网的请求才走代理。
Burp Suite的Repeater模块是练靶场的神器,可以手动修改请求参数,观察响应变化。Intruder模块适合做暴力破解和参数fuzzing。Scanner模块在社区版里功能有限,但手动测试也够用了。
提示:Burp Suite的证书要装到浏览器里,不然HTTPS请求会报错。靶场一般是HTTP的,不装证书也能用,但如果靶场配了HTTPS,就必须装证书。
5.3 靶场数据的备份与迁移
搭好的靶场环境,如果换机器或者重装系统,重新搭一遍很费时间。我的做法是定期备份虚拟机的快照,同时把靶场的数据库导出:
mysqldump -u root -p --all-databases > /backup/all_databases.sql靶场的代码目录也打包备份:
tar -czvf /backup/webapps.tar.gz /var/www/html/恢复的时候,先装好基础环境,然后导入数据库和代码:
sudo mysql -u root -p < /backup/all_databases.sql sudo tar -xzvf /backup/webapps.tar.gz -C /这样十分钟就能恢复整个靶场环境,比重新搭建快得多。
5.4 从靶场到实战的能力迁移
靶场练熟了,怎么用到实际工作中?我的体会是:靶场练的是漏洞原理和利用手法,实战考的是信息收集和漏洞组合。
在靶场里,你知道漏洞在哪里,直接去利用就行。但在实战中,你需要先做信息收集,找到可能的入口点,然后逐个测试。这个能力靶场给不了,需要额外练习。
我的建议是:靶场练到一定程度后,可以尝试一些模拟实战环境的平台,比如自己搭一个包含多个漏洞的Web应用,然后从外网视角去测试。或者参加一些CTF比赛,CTF的Web题目往往需要组合多个漏洞才能拿到flag,这个思路和实战很接近。
另外,靶场里的漏洞都是已知漏洞,实战中更多是逻辑漏洞和业务漏洞。这些在靶场里练不到,需要在实际项目中积累经验。但靶场打下的基础是必要的,没有这个基础,连常见的注入和XSS都搞不定,更别说逻辑漏洞了。
6. 环境维护与长期使用建议
6.1 定期更新与版本管理
靶场代码更新频率不高,但偶尔会有bug修复和新漏洞添加。定期更新靶场代码:
cd /var/www/html/dvwa sudo git pull cd /var/www/html/pikachu sudo git pull更新之前先备份数据库,因为有些更新会修改数据库结构。更新之后如果页面报错,检查一下配置文件有没有被覆盖。
PHP和MySQL的版本也要关注。Ubuntu的软件源会推送安全更新,但大版本升级可能会影响靶场兼容性。我的做法是锁定PHP和MySQL的大版本,只装安全补丁,不升大版本:
sudo apt-mark hold php7.4 mysql-server这样系统更新的时候不会把PHP升到8.x,避免兼容性问题。
6.2 资源占用优化与性能调优
五个靶场同时跑,Apache和MySQL的内存占用会比较高。如果虚拟机内存只有2GB,可能会卡。优化方法:
- 关闭不用的Apache模块:
sudo a2dismod autoindex status - 调整MySQL的缓冲池大小:在
/etc/mysql/mysql.conf.d/mysqld.cnf里设置innodb_buffer_pool_size = 128M - 关闭靶场里不用的功能模块
如果只是偶尔练某个靶场,可以把其他靶场的目录临时改名,Apache就不会加载它们:
sudo mv /var/www/html/mutillidae /var/www/html/_mutillidae需要的时候再改回来。
6.3 靶场环境的日常使用习惯
最后分享几个我养成的使用习惯:
第一,每次练习前打快照。靶场练着练着可能会把数据库搞乱,或者上传一些奇怪的文件,打快照可以随时回滚。
第二,记录练习笔记。每个漏洞的利用过程、payload、遇到的坑,都记下来。靶场练多了容易忘,笔记是最好的复习资料。
第三,不要只练一个靶场。DVWA练熟了,换Pikachu练,同样的漏洞在不同靶场里的实现方式可能不一样,多练几个能加深理解。
第四,定期重置数据库。靶场练久了,数据库里会积累很多测试数据,影响练习效果。DVWA有"Create / Reset Database"按钮,其他靶场可以手动重新导入SQL文件。
这套环境我用了两年多,从最初的DVWA单靶场,慢慢加到五个,中间重装过好几次,踩过的坑基本都写在上面的内容里了。搭建过程不算复杂,但细节很多,尤其是数据库连接和权限配置这两块,新手很容易卡住。按照上面的步骤一步步来,基本上两三个小时就能全部搞定。