恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
本地搭建五大Web安全靶场:Docker实战与练习指南
首页
资讯中心
/
本地搭建五大Web安全靶场:Docker实战与练习指南
本地搭建五大Web安全靶场:Docker实战与练习指南
发布时间:2026/10/17 7:39:41
1. 为什么要在本地搭一套Web靶场很多人第一次接触Web安全都是从找个在线靶场练手开始的。在线靶场确实方便打开浏览器就能用但用久了你会发现几个绕不开的问题网络延迟忽高忽低、部分功能被阉割、数据没法持久化保存、想改源码做二次实验根本做不到。更关键的是在线环境你永远不知道背后是谁在维护练习数据的安全性没法保证。所以真正想系统练Web安全的人最后基本都会走到同一条路上——在本地或者自己的实验环境里搭一套完整的靶机集合。DVWA、MCIR、Pikachu、Mutillidae、BWAPP这五个算是目前覆盖面最广、难度梯度最合理的组合。DVWA适合入门打基础Pikachu中文界面对新手友好Mutillidae和BWAPP属于题库型靶场题目量大、知识点全MCIR则偏向于编码和注入的专项训练。这套组合搭下来你能覆盖SQL注入、XSS、CSRF、文件包含、文件上传、命令执行、SSRF、XXE、反序列化等几乎所有OWASP Top 10里的核心漏洞类型。而且因为都是开源项目源码可读可改遇到不懂的漏洞可以直接翻代码看逻辑这是在线靶场给不了的。这篇文章我会把五个靶机的搭建过程完整走一遍包括环境选型、依赖处理、数据库配置、常见报错排查以及我自己踩过的坑。目标很明确你照着做能在一台机器上把这五个靶场全部跑起来并且知道每个靶场适合练什么、怎么练效率最高。提示本文所有操作均在授权的本地实验环境中进行仅用于安全技能学习。请勿将相关技术用于任何未经授权的系统。2. 环境选型为什么我最终选了Docker加一台Linux虚拟机2.1 三种主流搭建方式的对比搭靶机这件事方式选择直接决定了你后面要花多少时间在环境上。我前后试过三种方式各有优劣先摆出来对比。搭建方式优点缺点适合人群集成环境包如某面板一键安装图形化操作版本老旧PHP版本固定部分靶场跑不起来纯新手只想快速看效果手动编译LAMP完全可控能学到环境配置耗时依赖冲突多容易劝退想深入理解Web环境的人Docker容器隔离干净一键启停可移植需要懂基础Docker命令有一定基础、追求效率的人我最早用的是集成环境包装DVWA没问题但到了Mutillidae就各种报错原因是它要求的PHP扩展和数据库版本跟集成包里的对不上。后来手动编译LAMP光解决PHP版本和MySQL认证方式的冲突就花了大半天。最后转向Docker五个靶场全部跑起来只用了不到两小时。2.2 我的实际环境配置我用的是一台Linux虚拟机配置不高2核4G内存40G硬盘跑这五个靶场绰绰有余。系统选的是主流的Linux发行版内核版本5.x以上。Docker和Docker Compose装好之后剩下的就是拉镜像、写编排文件。这里有个经验不要把所有靶场塞进一个容器。我一开始图省事想在一个容器里装多个靶场结果PHP版本冲突、数据库端口冲突、Web根目录冲突改到最后自己都乱了。正确做法是每个靶场一个独立容器通过不同的端口映射对外提供服务互不干扰。端口规划我建议这样分配避免和宿主机已有服务冲突DVWA8081Pikachu8082Mutillidae8083BWAPP8084MCIR8085数据库我统一用MySQL 5.7的镜像因为这个版本对老靶场的兼容性最好。PHP统一用5.6或7.2的镜像具体看靶场要求。下面逐个说。3. DVWA入门第一站但配置里有几个隐藏坑3.1 DVWA到底练什么DVWA全称Damn Vulnerable Web Application是Web安全入门的经典靶场。它的特点是每个漏洞类型都分了四个难度等级Low、Medium、High、Impossible。这个设计非常巧妙你可以从Low开始看最原始的漏洞代码然后逐级往上观察防护措施是怎么一步步加上的最后看Impossible级别是怎么彻底堵死漏洞的。这种递进式学习路径比直接看修复方案要直观得多。你能亲眼看到为什么简单的字符串过滤不够、为什么黑名单机制容易被绕过、为什么预编译才是正解。3.2 Docker方式搭建DVWA的完整步骤先拉镜像。DVWA官方没有维护Docker镜像但社区有可用的版本我用的是比较稳定的一个。docker pull vulnerables/web-dvwa拉完之后直接跑docker run -d -p 8081:80 --name dvwa vulnerables/web-dvwa等几秒钟浏览器访问http://你的虚拟机IP:8081应该能看到DVWA的登录页。默认账号是admin密码是password。登录进去之后第一件事是点左侧菜单的Setup / Reset DB拉到页面底部点Create / Reset Database。这一步会初始化数据库创建必要的表并插入测试数据。很多人卡在这里登录进去发现所有功能都报数据库错误就是因为没做这一步。3.3 DVWA配置中最容易踩的三个坑第一个坑是数据库连接失败。如果你用的是自己搭的MySQL而不是容器内置的需要改DVWA的配置文件。配置文件在/var/www/html/config/config.inc.php里面有几个关键参数$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] pssw0rd;注意db_server如果写localhost在某些PHP版本下会走socket连接而不是TCP导致连接失败。统一写127.0.0.1最稳妥。第二个坑是文件上传功能不可用。DVWA的文件上传漏洞模块需要Web目录有写权限容器里默认权限可能不够。进容器执行docker exec -it dvwa bash chmod -R 777 /var/www/html/hackable/uploads/ chmod -R 777 /var/www/html/external/第三个坑是PHP版本导致的函数弃用警告。DVWA有些代码用了老版本PHP的函数在新版本PHP下会报warning虽然不影响功能但页面上会刷一堆黄字。解决办法是在php.ini里把display_errors关掉或者把错误报告级别调低。这个看个人习惯我一般留着因为warning本身也是学习信息。4. Pikachu中文界面下的系统化漏洞训练4.1 Pikachu的定位和特色Pikachu是一个国产的Web安全靶场全中文界面对英语不太好的朋友非常友好。它的漏洞分类很清晰按模块划分SQL注入、XSS、CSRF、文件包含、文件下载、文件上传、命令执行、暴力破解、越权、SSRF、反序列化等等每个模块下面又有若干子题目。跟DVWA比Pikachu的题目数量更多覆盖面更广而且每个题目都有提示告诉你这个漏洞的原理是什么、怎么利用。它更像是一本可以动手操作的教科书。4.2 搭建Pikachu的实操过程Pikachu官方推荐用PHPMySQL环境Docker镜像也有现成的。我用的是自己构建的方式因为官方镜像有时候更新不及时。先准备一个基础的LAMP容器或者直接用现成的Pikachu镜像docker pull area39/pikachu docker run -d -p 8082:80 --name pikachu area39/pikachu启动后访问http://你的虚拟机IP:8082应该能看到Pikachu的首页。首次访问需要点初始化安装它会自动创建数据库和表。如果初始化报错大概率是数据库权限问题。进容器检查docker exec -it pikachu bash mysql -uroot -p然后手动创建数据库并授权CREATE DATABASE pikachu; GRANT ALL PRIVILEGES ON pikachu.* TO rootlocalhost IDENTIFIED BY root; FLUSH PRIVILEGES;4.3 Pikachu练习中的高效路径Pikachu的题目很多如果从头到尾一个个做容易疲劳。我的建议是按漏洞类型分组练而不是按题目顺序。比如SQL注入模块先把数字型、字符型、搜索型、XX型全部做一遍感受不同注入点的构造差异。然后集中做盲注、报错注入、时间注入理解在没有回显的情况下怎么获取数据。最后做宽字节注入和二次注入这两个是进阶内容理解了会有种原来还能这样的感觉。XSS模块也是类似反射型、存储型、DOM型各做几个然后重点研究绕过手法大小写混写、标签变形、编码绕过、事件触发。Pikachu的XSS题目里有一些过滤规则你需要观察它过滤了什么、没过滤什么然后构造payload。注意Pikachu的部分题目需要你手动改源码才能继续比如有些过滤规则写死了你想测试更高级的绕过就得先把过滤放宽。这是正常的靶场就是用来改的。5. Mutillidae与BWAPP题库型靶场的正确打开方式5.1 Mutillidae的安装与配置要点Mutillidae是一个老牌的Web安全靶场题目量非常大号称有几十个漏洞类别、上百道题目。它的界面比较朴素但内容极其丰富适合已经入门、想刷题巩固的人。Docker搭建docker pull citizenstig/nowasp docker run -d -p 8083:80 --name mutillidae citizenstig/nowasp访问http://你的虚拟机IP:8083首次进入需要点Setup按钮初始化数据库。Mutillidae的初始化有时候比较慢耐心等一会儿。Mutillidae有个特点是题目提示藏在页面里。很多题目你看着是一个普通功能但页面上某个角落会有一行小字提示试试注入这里。养成习惯每进一个页面先看源码和页面底部提示往往就在那里。5.2 BWAPP的搭建和难度分级BWAPP全称Buggy Web Application也是一个题库型靶场。它的特点是每道题都有明确的难度标记Low、Medium、High。而且它支持的漏洞类型非常全从常见的注入、XSS到比较冷门的LDAP注入、SSI注入、XPath注入都有。Docker搭建docker pull raesene/bwapp docker run -d -p 8084:80 --name bwapp raesene/bwapp访问http://你的虚拟机IP:8084点Install按钮初始化。BWAPP的初始化会创建数据库并填充数据完成后用默认账号bee/bug登录。BWAPP的题目选择界面很直观你可以按漏洞类型筛选也可以按难度筛选。我的建议是先按难度筛Low把所有类型的Low都做一遍建立整体认知然后再回头做Medium和High。这样比死磕一个类型效率高。5.3 两个靶场的配合使用策略Mutillidae和BWAPP功能有重叠但侧重点不同。Mutillidae的题目更偏向真实场景模拟很多题目是模拟一个完整的业务系统你需要在这个系统里找漏洞。BWAPP则更偏向知识点覆盖每道题聚焦一个具体漏洞。我的用法是用BWAPP查漏补缺用Mutillidae练综合能力。比如我在BWAPP里发现某个漏洞类型我没做过就去BWAPP里找到对应题目练一下。练完之后去Mutillidae里找类似的场景看看在更复杂的业务逻辑里怎么利用。这种点-面结合的练法比单纯刷题效果好很多。6. MCIR被低估的编码与注入专项训练场6.1 MCIR是什么为什么值得单独搭MCIR全称Magical Code Injection Rainbow是一个专注于编码和注入的靶场。它的名气不如前面几个大但我觉得它是被严重低估的。MCIR的题目设计非常硬核它不给你完整的业务系统而是给你一个具体的注入点让你用各种编码方式去绕过过滤。比如它的SQL注入模块有专门的编码绕过关卡你需要用URL编码、十六进制编码、Unicode编码、Base64编码等各种方式构造payload。这种训练对于理解WAF绕过、过滤器绕过非常有帮助。6.2 MCIR的搭建过程MCIR的Docker镜像相对少一些我用的是自己构建的方式。先拉一个PHPApache的基础镜像然后把MCIR的源码放进去。docker pull php:5.6-apache docker run -d -p 8085:80 --name mcir php:5.6-apache然后把MCIR源码复制进容器docker cp ./mcir/ 容器ID:/var/www/html/进容器安装必要的扩展docker exec -it mcir bash docker-php-ext-install mysqli重启容器后访问http://你的虚拟机IP:8085/mcir应该能看到MCIR的首页。6.3 MCIR的练习方法和心得MCIR的题目界面很简洁就是一个输入框加一个提交按钮。但别小看这个输入框它背后有各种过滤规则你需要不断尝试不同的编码方式才能绕过。我的练习方法是先看源码理解过滤逻辑然后针对性地构造payload。MCIR的源码是开放的你可以直接看到它用了什么函数过滤、过滤了哪些字符。然后你就能推理出哪些编码方式能绕过这个过滤。比如它用str_replace把单引号替换掉了那你可以用URL编码%27或者用十六进制0x27或者用Unicode编码。具体用哪种取决于它在替换之前有没有做解码。这种看源码-推理-验证的循环是MCIR最大的价值。它训练的不是记住某个payload而是理解过滤逻辑并找到绕过方法的能力。7. 五个靶机统一管理用Docker Compose一键启停7.1 为什么要用Compose前面五个靶机是分别用docker run启动的管理起来比较麻烦。每次要开靶场得敲五条命令要关又得敲五条。而且容器之间的网络、端口、数据卷配置散落在各处时间长了容易忘。用Docker Compose可以把这些配置写在一个文件里一条命令全部启动一条命令全部停止。而且配置文件本身就是文档以后换机器或者重装直接拿这个文件就能恢复环境。7.2 完整的Compose编排文件下面是我实际在用的编排文件五个靶机全部包含version: 3 services: dvwa: image: vulnerables/web-dvwa ports: - 8081:80 restart: unless-stopped pikachu: image: area39/pikachu ports: - 8082:80 restart: unless-stopped mutillidae: image: citizenstig/nowasp ports: - 8083:80 restart: unless-stopped bwapp: image: raesene/bwapp ports: - 8084:80 restart: unless-stopped mcir: image: php:5.6-apache ports: - 8085:80 volumes: - ./mcir:/var/www/html/mcir restart: unless-stopped把文件保存为docker-compose.yml然后在同目录下执行docker-compose up -d五个靶机就会依次启动。要停止docker-compose down要查看状态docker-compose ps7.3 资源占用和性能调优五个容器同时跑内存占用大概在1.5G到2G之间。如果你的虚拟机内存只有2G可能会有点吃紧。可以给每个容器加内存限制deploy: resources: limits: memory: 256M不过要注意内存限制设得太低MySQL可能会启动失败。我一般给数据库相关的容器至少512M。另外如果只是偶尔练某个靶场不需要五个全开。可以只启动需要的那个docker-compose up -d dvwa这样只启动DVWA其他容器不动省资源。8. 搭建过程中那些让我抓狂的报错和解决思路8.1 端口冲突最常见也最容易解决报错信息通常是Bind for 0.0.0.0:8081 failed: port is already allocated。这说明8081端口被占用了。先查谁占用了netstat -tlnp | grep 8081或者ss -tlnp | grep 8081找到进程后要么停掉那个进程要么改靶机的端口映射。改端口很简单把8081:80改成8091:80就行。8.2 数据库连接被拒绝认证方式的问题这个坑我在手动搭LAMP的时候踩过。MySQL 8.0默认用caching_sha2_password认证方式而老版本的PHP MySQL扩展不支持这个方式导致连接被拒绝。解决办法有两个一是把MySQL用户改成mysql_native_password认证ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;二是直接用MySQL 5.7的镜像避开这个问题。我后来统一用5.7省事。8.3 页面显示500错误看日志是唯一出路500错误是最让人头疼的因为它不告诉你具体哪里错了。这时候必须看日志。Docker容器的日志用docker logs 容器名如果是Apache的日志进容器看docker exec -it 容器名 bash tail -f /var/log/apache2/error.logPHP的错误日志通常在/var/log/php_errors.log或者/var/log/apache2/error.log里。看到具体的错误信息问题就解决了一半。8.4 中文乱码字符集配置Pikachu和Mutillidae是中文界面有时候会出现乱码。这通常是数据库字符集的问题。检查数据库和表的字符集SHOW VARIABLES LIKE character%;确保character_set_server和character_set_database都是utf8mb4。如果不是在MySQL配置文件里加上[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci然后重启MySQL。9. 五个靶场怎么安排练习顺序才不浪费时间9.1 按基础到进阶的推荐路径如果你刚开始学Web安全我建议的顺序是DVWA → Pikachu → BWAPP → Mutillidae → MCIR。DVWA打基础理解漏洞的基本原理和利用方式。Pikachu巩固中文语境下的漏洞分类题目有提示适合自学。BWAPP查漏补缺把DVWA和Pikachu没覆盖到的漏洞类型补上。Mutillidae练综合能力在复杂业务场景里找漏洞。MCIR最后练因为它是专项训练需要前面的基础打牢了才有意义。9.2 每个靶场的高效练习方法DVWA不要只做Low。很多人做完Low就觉得自己会了其实Medium和High才是精华。Medium开始有过滤你需要研究怎么绕过。High的过滤更严但往往还有漏网之鱼。Impossible级别看代码理解正确的防护应该怎么写。Pikachu按模块集中练。不要今天做一题SQL注入明天做一题XSS。集中做同一个类型才能发现规律。比如SQL注入连续做十道你会总结出注入点的判断方法、闭合方式的判断方法、注入类型的判断方法。BWAPP用筛选功能。BWAPP的题目列表可以按难度和类型筛选。先筛Low全部做一遍。然后筛Medium重点做那些你在Low里做过的类型对比难度提升在哪里。Mutillidae先看提示再做题。Mutillidae的提示藏得比较深但找到之后能省很多时间。不要一上来就硬试先花两分钟找提示。MCIR必须看源码。MCIR的题目不看源码基本做不出来因为过滤规则是自定义的。看源码理解过滤逻辑然后构造绕过payload这是MCIR的正确用法。9.3 练习之外的补充建议靶场练得再多也只是已知漏洞的已知利用方式。真实环境里的漏洞往往更隐蔽、更复杂。所以练完靶场之后建议做两件事一是读真实漏洞的披露报告。看看别人是怎么在真实系统里发现漏洞的思路和靶场有什么不同。二是自己写代码然后自己找漏洞。写一个简单的Web应用故意留几个漏洞然后尝试利用。这个过程能让你从攻击者视角切换到开发者视角理解漏洞是怎么产生的。提示所有练习请在本地实验环境或获得明确授权的环境中进行。未经授权的测试可能违反法律法规。10. 一些让我少走弯路的经验搭这套靶机的过程中我最大的体会是环境问题比技术问题更耗时间。技术问题你查资料、看文档总能解决。但环境问题往往是这个版本和那个版本不兼容这个配置和那个配置冲突排查起来很烦。所以我的建议是能用Docker就用Docker能用现成镜像就用现成镜像。不要为了学到底层而手动编译所有东西那是另一个方向的学习跟练Web安全是两回事。你的时间应该花在漏洞原理和利用技巧上而不是花在解决PHP扩展编译错误上。另外养成写笔记的习惯。每个靶场的搭建过程、遇到的报错、解决方法都记下来。下次换机器或者重装直接翻笔记能省很多时间。我现在用的这套Compose文件就是踩了无数次坑之后沉淀下来的。最后靶场只是工具不是目的。不要为了刷题而刷题每做完一道题问自己这个漏洞的本质是什么为什么会产生怎么防护把这三个问题想清楚比做十道题都有用。