☰
Web安全入门:四大靶场安装实战与Docker一键部署方案
2026/9/24 17:04:05 网站建设 项目流程

这标题一看就知道是给刚入门的Web安全学习者准备的。说实话,我当年学的时候最头疼的不是漏洞原理,而是环境装不起来。手里一份DVWA的教程,照着装了一下午,最后卡在PHP版本兼容上,愣是白屏一整天。后来把Pikachu、sqli-labs、upload-labs这些靶场都逐个试过一遍,才发现安装这件事本身就有不少门道。这篇就把我从零开始装这四个靶场的完整过程、踩过的坑、以及最终怎么用Docker一把梭的方案都整理出来,给需要的人省点时间。

1. 装之前先搞清楚:这四个靶场到底在练什么

很多新手犯的错是拿到靶场就装,装完就刷题,但根本不清楚每个靶场的训练定位。结果就是DVWA刷了两遍SQL注入,到sqli-labs里又迷路了,因为两者出题思路完全不一样。先花五分钟搞清楚每个靶场是干嘛的,后面练起来会顺手很多。

1.1 DVWA:综合型入门首选,难度分级是它最大的价值

DVWA(Damn Vulnerable Web Application)是目前最常见的入门靶场,它最大的特点是内置了四个安全等级:Low、Medium、High、Impossible。同一个漏洞,你在Low级别能打进去,切到High级别同样的payload就失效了,Impossible级别的代码几乎从根上封死了这个漏洞。这种设计让你能直观感受“同样的功能,写法不同,安全性天差地别”。

它覆盖的漏洞类型也比较全:SQL注入、XSS、命令注入、文件上传、CSRF、文件包含、暴力破解,基本覆盖了OWASP Top 10里的核心项。适合作为第一个系统学习的靶场,把Web漏洞的“全家福”先过一遍。

要注意的是,DVWA只做功能演示,代码量不大,它是单文件式PHP应用,没有复杂的框架逻辑,安装时要关注的其实就是配置文件里的数据库连接信息。

1.2 Pikachu:中文界面、带漏洞原理讲解,对新手极其友好

Pikachu这个靶场我愿称之为“中文亲妈”。它和DVWA最大的区别是界面全中文,而且每个漏洞模块下面都有原理说明文字,告诉你这个漏洞是怎么产生的、怎么测。对英文一般、看DVWA界面费劲的初学者来说,Pikachu是第一选择。

它的漏洞覆盖面比DVWA还广一些,除了常规的SQL注入、XSS、CSRF,还加入了RCE、XXE、SSRF、反序列化、越权,以及一个独立的“PHP特性”模块,专门演示一些PHP函数使用不当导致的安全问题。难度上比DVWA的Low级别稍微高一点,更适合在DVWA入门之后用来进阶。

有意思的是,Pikachu的作者还配套了在线漏洞讲解文档,每个模块都有详细的前因后果。所以这靶场不只是“练手”,还能当“教程”用。

1.3 sqli-labs:SQL注入专项训练,从基础到偏门全覆盖

如果你确定自己要主攻SQL注入,那sqli-labs是绕不开的。这个靶场是印度安全研究员写的,一共65关,从最基础的“单引号报错”开始,逐步覆盖联合查询、报错注入、盲注、堆叠注入、二次注入、宽字节注入、order by注入,到后期的过滤绕过等偏门技巧。

它的每一关都是独立的PHP文件,文件名本身就是关卡编号(比如Less-1.php、Less-2.php)。这对学习特别友好——你看一眼URL就知道自己在练哪一关,复现笔记也好做。不过sqli-labs界面极度简陋,没有任何花哨的页面,基本就是一个带参数链接的空白页面,纯粹服务功能。

1.4 upload-labs:文件上传漏洞专项训练

upload-labs是目前网络上常见的文件上传专项靶场,早期版本大约20关,新版本关卡更多,关卡逻辑覆盖了前端JS校验、MIME类型校验、扩展名黑名单绕过、文件头校验、二次渲染、.htaccess利用等常见场景。

如果你目标是搞懂“为什么有时候明明能上传一句话木马,但就是连不上”,或者想搞懂“服务端到底校验了什么东西”,这个靶场必须刷。它和前面几个靶场的区别在于,它更偏向渗透测试中的对抗思维——每一关都是防守方设计的一个常见失误,你要找出绕过方式。

这四个靶场各司其职:DVWA打基础,Pikachu进阶并补原理,sqli-labs和upload-labs是专项深度训练。装一套环境,四者缺一不可。

2. 环境准备:Windows下用phpStudy装之前必须想清楚的三个问题

大多数学Web安全的人主力机是Windows,所以最容易上手的方案是装集成环境。但我见过太多人直接百度“phpStudy下载”,装完新版发现靶场跑不起来。这里有几个问题必须先想明白。

2.1 PHP版本到底选哪个:新版不等于能用

这是最容易被坑的点。DVWA、Pikachu、sqli-labs、upload-labs这些都是老项目,最后更新时间基本都在2015到2019年之间。它们依赖的PHP特性、数据库扩展方式都是老一套。尤其是老靶场对PHP 7.0以上版本中移除的mysql扩展,以及PHP 7.4以后对短标签的默认关闭,都极其敏感。

我的建议是:Windows下用 phpStudy 的话,PHP版本选择PHP 5.6.x(phpStudy中该版本为5.6.27左右)。这个版本对四个靶场兼容性最优,基本开箱就能跑。

有人会说,PHP 5.6太老了,有安全漏洞。这是靶场环境,要的就是老版本才会有漏洞,本地虚拟机里跑没有任何问题。不要在靶场环境强行追求新版本,那不是学习,是给自己找麻烦。

2.2 MySQL默认密码和端口冲突:两个高频翻车点

phpStudy自带MySQL,但有两个问题经常让人卡住:

一是phpStudy面板里MySQL的默认密码。新版本phpStudy安装完,MySQL默认密码可能是空,也可能是root,具体要看面板首页显示。很多靶场安装教程统一让你填“root”,结果换了个phpStudy版本就翻车。

二是端口冲突。如果本机已经装了其他MySQL或者别的服务占用了3306端口,phpStudy里的MySQL根本启动不了。我见过最夸张的一次,是有人电脑上装了XAMPP没卸载干净,两个集成环境的MySQL服务互相抢端口,开了这个关那个。

解决方案:在phpStudy的“设置—端口常规设置”里,把MySQL端口改成3336之类不常用的端口。然后对应地,靶场配置文件里的数据库连接端口也要同步改。

2.3 Web根目录的存放路径:千万别放在带中文的路径下

phpStudy的网站根目录默认是phpStudy_Pro\WWW,这是中文路径。诡异的是,大部分时候靶场放里面能跑,但偶尔会有解析异常。我建议直接在磁盘根目录建一个纯英文目录,比如D:\www,然后在phpStudy的“网站—创建站点”里把根目录指向这里。

另外,子目录名也别用中文。我见过有人把解压出来的DVWA文件夹重命名成“DVWA-靶场”,结果直接白屏,改成DVWA-main就正常了。

3. 四个靶场逐个安装:关键配置文件和注意事项

这一部分直接上干货,按顺序把每个靶场的安装要点和配置文件位置列出来。真实操作时建议四个都解压到Web根目录下,然后用http://127.0.0.1/dvwa/这样的路径访问。

3.1 DVWA:改一处配置文件,登录默认账号密码要记住

DVWA从GitHub下载后(搜索DVWA仓库,下载zip解压,或git clone),把目录重命名为dvwa,放到Web根目录下。

接下来最关键的一步:复制配置文件。DVWA自带一个config/config.inc.php.dist文件,你需要手动复制一份,把副本重命名为config.inc.php。很多新手直接跳过这步,打开页面就报错“Configuration file not found”,还以为自己环境坏了。

打开config.inc.php,需要修改的核心内容:

$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_port' ] = '3306'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = '你的MySQL密码'; $_DVWA[ 'db_database' ] = 'dvwa';

如果你在phpStudy里改了MySQL端口,这里的db_port要同步改。

保存后,浏览器访问http://127.0.0.1/dvwa/,首次打开页面下方会提示你点击“Create/Reset Database”按钮初始化数据库,点击后会自动建库。默认登录账号是admin,密码是password。登录后默认安全等级是Impossible,记得去“DVWA Security”里把等级调到Low再开始练。

3.2 Pikachu:改数据库连接配置,无需建库,自动完成

Pikachu的安装比DVWA还简单。GitHub上下载源码(搜索pikachu),解压后把目录重命名为pikachu,放到Web根目录。

它只需要改一个文件:inc/config.inc.php。打开后找到:

const DB_HOST = '127.0.0.1'; const DB_PORT = '3306'; const DB_USER = 'root'; const DB_PASS = '你的MySQL密码'; const DB_NAME = 'pikachu';

改完刷新页面即可。Pikachu首次访问时会自动检测数据库是否存在,不存在会自动创建,不需要你手动导入SQL,这点非常友好。首页会有个“初始化”按钮可点击,点击后确认可以看到“初始化成功”的提示。

有个小细节,Pikachu的目录结构里有一个pkxss子目录,是独立的XSS靶场,里面也有自己的数据库配置,路径是pkxss/inc/config.inc.php。如果你打算用Pikachu练XSS,这个文件也得改。虽然两个文件的内容几乎一样,但漏改任何一个,对应的功能就无法正常工作。

3.3 sqli-labs:需要手动点击Setup数据库初始化

sqli-labs的安装相对繁琐一点,但也就两步。

第一步,解压后把目录重命名为sqli-labs,放到Web根目录。然后找到sql-connections/sql-connect.php,打开修改:

$dbuser ='root'; $dbpass ='你的MySQL密码'; $dbname ='security'; $host = '127.0.0.1'; $port = '3306';

第二步,浏览器访问http://127.0.0.1/sqli-labs/,首页会有一个**“Setup/reset Database for labs”的链接,点击它会自动创建security数据库。注意,这一步不是可选的**,不点的话后面每一关都会报错连接不到数据库。

sqli-labs的关卡文件都叫Less-1.php、Less-2.php这种格式,访问http://127.0.0.1/sqli-labs/Less-1.php就能进入第一关。有些版本的sqli-labs还带了Less-1到Less-65的完整关卡,但有些精简版只到22关,下载的时候注意看文件完整性。

3.4 upload-labs:一个容易忽略的上传目录权限问题

upload-labs分几个版本,老版本比较轻量,把源码解压到Web根目录就可以访问。新版本可能需要composer install装依赖。这里以常见的老版本为例。

解压后重命名目录为upload-labs,放到Web根目录。它也有一个数据库配置文件,路径一般是config.php,但大部分早期版本不需要数据库,纯文件上传逻辑,直接访问就能用。

容易翻车的点在上传目录权限。upload-labs默认上传目录是upload/,如果这个目录没有写权限,测试上传时会一直提示“上传失败”。Windows下phpStudy通常不会有权限问题,但如果你用的是Linux服务器,要记得:

chmod -R 755 /var/www/html/upload-labs/

如果你用的是新版upload-labs,还需要检查PHP版本。新版用了一些更新的语法特性,PHP 5.6可能跑不起来,需要PHP 7.2以上。装了新版跑不起来的话,先看一下首页左侧的版本号提示,别急着怪环境。

四个靶场装完之后,建议在Web根目录下顺手建一个index.html,写一个简单的导航页,把四个靶场的URL链接放上去,后面用起来省事很多。

4. 用Docker Compose一把梭:跨平台部署方案

如果你用的是macOS或者Linux,或者你嫌弃Windows上一堆集成环境的配置麻烦,那就直接上Docker Compose。这个方案最省心,配置一次之后,以后换电脑也能秒速重建。

4.1 为什么推荐Docker而不是继续手工安装

手工安装的好处是你能看到每个配置文件在哪、改了什么,理解靶场是怎么跑起来的。但坏处也很明显:PHP版本兼容、MySQL密码、端口冲突、路径中文,任何一个环节出问题都可能卡半小时以上。

Docker Compose的好处是把环境依赖、PHP版本、MySQL版本全部固化在配置文件里,一次写好,哪里都能跑。而且容器之间互相隔离,不会污染宿主机环境。缺点是你对底层配置的感知会弱一些,但如果目标是练漏洞,不是研究环境,这个缺点完全可接受。

4.2 docker-compose.yml写法:一个服务对应一个靶场

我直接给出一份我自己在用的配置,四个靶场 + MySQL全部编排在一个Compose文件里。假设你已经装好了Docker Desktop,直接在任意目录新建docker-compose.yml:

services: db: image: mysql:5.7 container_name: vuln_db restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: dvwa ports: - "3306:3306" command: --character-set-server=utf8mb4 volumes: - db_data:/var/lib/mysql dvwa: image: vulnerables/web-dvwa container_name: dvwa restart: always depends_on: - db ports: - "8081:80" environment: DB_HOST: db DB_USER: root DB_PASSWORD: root DB_NAME: dvwa pikachu: image: area39/pikachu container_name: pikachu restart: always ports: - "8082:80" sqli-labs: image: acgpiano/sqli-labs container_name: sqli_labs restart: always ports: - "8083:80" upload-labs: image: c0ny1/upload-labs container_name: upload_labs restart: always ports: - "8084:80" volumes: db_data:

这份配置把四个靶场分别映射到宿主机的8081到8084端口,端口冲突概率大幅降低,也方便记忆。需要说明的是,Pikachu镜像不一定需要MySQL配置,它的Docker镜像内部自带了完整的LAMP环境,启动后直接访问即可。

4.3 启动、查看状态、关闭:三个必须记住的命令

启动全部服务:

docker compose up -d

查看服务状态和日志:

docker compose ps docker compose logs -f [服务名]

关闭环境:

docker compose down

这套命令的核心逻辑是:up -d让容器后台运行,ps确认状态,down终止所有容器但保留数据卷。数据库数据不会丢,因为绑定了db_data这个数据卷。

镜像拉取较慢时,需要先配置Docker镜像加速器。macOS和Windows版Docker Desktop在Settings—Docker Engine里,把国内镜像源加到registry-mirrors数组里,保存重启Docker即可。Linux上则在/etc/docker/daemon.json里配置,然后重启Docker服务。

4.4 容器方式访问后的验证

启动完成后,直接用浏览器访问:

  • DVWA:http://127.0.0.1:8081
  • Pikachu:http://127.0.0.1:8082
  • sqli-labs:http://127.0.0.1:8083
  • upload-labs:http://127.0.0.1:8084

DVWA容器版默认登录账号密码依然是admin/password,首次访问需要点“Create/Reset Database”。sqli-labs容器版默认数据库连接信息在镜像里已经配好,不需要自己在容器里改配置,访问首页点Setup即可。

5. 靶场装完之后的验证清单:如何确认每个靶场真能用了

很多人装完靶场,看到首页能打开就觉得“装好了”,结果练到一半发现某个模块怎么都不对。这里给一份我自己每次装完都会跑一遍的快速自检清单,大概五分钟能验证完全部功能。

5.1 四个靶场的核心功能验证方法

DVWA验证项:

  • 登录页能否正常加载,是否能登录成功(admin/password)。
  • 进入“Security”页面,能否把安全等级从Impossible切换为Low并保存。
  • 进入“SQL Injection”模块,在输入框提交一个1',如果页面报错或出现异常回显,说明SQL注入模块可用。
  • 进入“Upload”模块,随便传一个正常的txt文件,看能否上传成功。如果连正常文件都传不上去,说明上传模块有问题,需要检查upload目录权限。

Pikachu验证项:

  • 首页“初始化”是否提示成功。
  • 进入“SQL Injection—数字型注入”模块,提交一个单引号,看是否报错。
  • 进入“RCE—exec 'ping'”模块,提交127.0.0.1看是否回显ping结果。
  • 测试一下pkxss下的XSS题目,确保独立环境也正常。

sqli-labs验证项:

  • 首页是否显示关卡列表,点击Less-1能否正常打开。
  • 在Less-1页面URL后面加参数?id=1',如果页面报错,说明数据库连接正常、注入点存在。
  • 随机点开几关,比如Less-2、Less-23,确认没有大面积报错。

upload-labs验证项:

  • 进入第一关,按页面提示先上传一个正常图片,确认能成功显示。
  • 再尝试把PHP文件后缀改成.php.jpg或者1.php上传,看第二关、第三关的绕过逻辑是否正常触发。
  • 注意,有些关卡会要求你先创建一个包含特定内容的文件,比如第三关可能要.user.ini或.htaccess文件配合,这些在关卡描述里都会写,照着操作就好。

5.2 网络与端口自检:连不上先查这两项

如果上面某一步访问不了,先做两件事:

第一,在命令行里ping 127.0.0.1,确认本机网络栈正常。这一步看起来傻,但能排除偶发性的网络驱动异常。

第二,确认端口真正在监听。Windows下执行netstat -ano | findstr 8081,Linux/macOS下执行lsof -i:8081。如果端口没有监听,说明服务本身没起来,而不是靶场配置问题。

Docker环境有个特殊点:容器内的8081端口映射需要等待镜像完全初始化。镜像首次启动可能需要拉取依赖、初始化数据库,所以刚执行完docker compose up -d后不需要急着访问,等30秒左右再刷新浏览器。

5.3 容易被忽略的“后续”问题:靶场别裸奔在公网

这里必须提醒一句:这些靶场设计出来就是有漏洞的,绝不要部署到云服务器公网IP上。它们的存在价值是让你在本地或者内网环境里安全地练手,如果暴露到公网,分分钟就会被扫描工具盯上,沦为他人的跳板或挖矿肉鸡。

我个人的习惯是:本地环境用127.0.0.1访问;如果需要在虚拟机里装,就把虚拟机的网络模式设置为“仅主机模式”,其他机器无法访问,最稳妥。

6. 实测中我踩过的坑:排查链路与解决办法

这部分不是理论推演,都是我实际安装过程中真真切切遇到的,按“现象—原因—解决”的方式排出几条高频的链路,希望能帮你省下排查时间。

6.1 现象:DVWA页面能打开,但一点“Create/Reset Database”就报错

这种报错绝大多数出在数据库连接信息不对。我之前遇到过一次特别典型的,花了半小时,最终发现是phpStudy里的MySQL默认端口是3307而不是3306,而DVWA配置文件里还写的是3306,导致DB连接失败。

排查链路:

  1. 先去phpStudy面板,看MySQL当前实际使用的端口是多少;
  2. 再开一个终端,手动测试一下数据库账号密码能不能连上:mysql -uroot -p你的密码 -h127.0.0.1 -P3306;
  3. 最后同步修改DVWA的config.inc.php里的db_port、db_password。

6.2 现象:sqli-labs首页正常,随便点进一关就白屏或报错

这个坑主要出在PHP版本太高。sqli-labs很多文件用了老式mysql_query()函数,在PHP 7.0以后被移除,会直接报Call to undefined function mysql_query()。

解决办法:在phpStudy里把当前网站的PHP版本切换为5.6。在phpStudy的“网站—管理—PHP版本”里切换,或者直接在“设置—PHP版本”里改默认版本,改完重启Apache。

Docker方案的用户基本不会遇到这个问题,因为镜像内部已经配好了合适的PHP版本。这恰恰是Docker的又一个优势。

6.3 现象:upload-labs上传任何文件都提示失败

这个坑的根源通常不是PHP代码逻辑,而是上传目录没有写权限。Windows下主要是目录只读属性或phpStudy运行用户权限不足;Linux下就是目录权限问题。

还有一种情况是phpStudy开了“防跨站攻击”功能,限制了PHP只能访问站点的域名根目录,导致上传目录不可写。在phpStudy的“其他选项—PHP安全设置”里,找到open_basedir相关配置,把它留空或关闭即可。

6.4 现象:Docker Compose启动后,某个靶场反复重启

这种常见于数据库服务还没就绪,靶场容器就先启动了。虽然Compose文件里写了depends_on,但depends_on只保证容器启动顺序,不保证数据库已经初始化完成。

解决办法:第一个应用容器起来后,先执行docker compose logs db,看到里面有“ready for connections”字样,再刷新靶场页面。如果还是不行,重启一下应用容器:

docker compose restart dvwa

6.5 现象:四个靶场全部装好,但互相抢80端口

手工安装方案里,如果你把四个靶场都放在同一个Web根目录下,用不同子目录访问,一般不存在端口冲突。但如果你图省事,分别给四个靶场建了不同站点且都监听80端口,就会出问题。

我的建议是:手工安装就用“单站点多子目录”方案,统一通过http://127.0.0.1/dvwa、http://127.0.0.1/pikachu这种路径访问,不额外建站点,最省事也最不容易乱。

7. 日常使用的一些实操心得

这里分享几个我后来养成的习惯,算不上教程,但是能减少大量重复性工作。

第一,每次重装系统或换电脑后,最快重建靶场环境的方式是Docker Compose。一份docker-compose.yml文件保存好,所有环境配置都在里面,十分钟就能全装回来。手工安装的环境虽然也能用,但重装一遍至少要半小时,还容易踩版本坑。

第二,靶场的动手记录一定要做笔记。不光是留档,更重要的是记录自己每道关卡的思考路径。我自己的习惯是每刷一关,把使用的payload、页面返回结果、自己的理解写到一篇Markdown文档里,按靶场分目录整理。积累几个月之后,这会是一份比任何教程都适合自己的知识库。

第三,学习顺序很重要。以我接触过的大量初学者经验来看,比较省力的顺序是:DVWA按漏洞类型刷一遍,把每种漏洞的利用方式混个脸熟;然后Pikachu做补充,重点看它自带的原理讲解;再根据自己感兴趣的方向深入sqli-labs或upload-labs做专项训练。贪多嚼不烂,四个靶场同时练容易乱了节奏。

第四,务必在本地环境学习。我所介绍的所有安装方式,默认都是127.0.0.1访问本地环境。靶场资源应该用在本地虚拟机、Docker容器或者隔离的实验网络中,不建议对外开放。记住这一点,既能保证自己的安全,也能让学习过程更专注、更规范。

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

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

立即咨询