1. 为什么要在本地搭一个DVWA靶机搞安全测试或者Web渗透入门的朋友对DVWA这个名字应该不陌生。全称Damn Vulnerable Web Application翻译过来就是该死的脆弱Web应用它是一个故意留了一堆漏洞的PHP/MySQL Web系统专门给人练手用的。你可以在里面练SQL注入、XSS、文件包含、命令执行、CSRF、文件上传等等常见漏洞的利用和防御而且它自带四档安全等级Low、Medium、High、Impossible可以从完全不设防一路打到固若金汤非常适合循序渐进地理解漏洞原理和防护思路。那为什么要在本地搭直接在线上找靶场不行吗我自己的体会是本地靶机有三个不可替代的好处。第一是网络延迟为零你跑sqlmap或者burp爆破的时候本地响应几乎是瞬时的效率比连远程靶场高一个数量级。第二是数据完全可控你可以随便改数据库、改源码、看日志甚至把整个环境搞崩了直接删掉重来没有任何心理负担。第三是离线可用出差在高铁上、断网的环境里照样能练。在Mac环境下搭DVWA主流就两条路一条是用XAMPP这种集成环境把Apache、MySQL、PHP一次性装好然后把DVWA的源码丢进web目录另一条是用Docker拉一个现成的DVWA镜像或者自己写compose文件一条命令起环境。这两条路我都走过各有各的坑下面我把整个思路、操作细节和踩过的雷都摊开讲。这篇文章适合谁看如果你是刚接触Web安全、想在Mac上快速搞一个能打的靶机或者你之前搭过但总是卡在数据库连接、权限报错这些地方那这篇内容应该能帮你省下不少时间。我会把两种方案都完整走一遍包括参数怎么选、报错怎么排、以及一些文档里不会写的实操心得。2. 方案选型XAMPP还是Docker先想清楚2.1 两种方案的本质区别XAMPP的思路是把一整套Web运行环境装进你的系统里。它包含Apache、MySQL/MariaDB、PHP和Perl装完之后你的Mac上就多了一套完整的LAMP栈DVWA只是往这个栈里塞的一个网站而已。这种方式的优点是直观你能看到每一个组件改php.ini、改httpd.conf都很直接适合想顺便了解Web环境构成的人。缺点是它会往系统里装东西端口会占用卸载的时候如果没清干净会留一堆残留。Docker的思路是把整个环境打包成一个隔离的容器。DVWA镜像里已经包含了操作系统层、Web服务器、PHP、数据库你只需要把容器跑起来它就是一个自给自足的靶机。优点是干净、可复制、删了就没了不会污染你的Mac系统而且换机器的时候一条命令就能重建。缺点是你得先理解Docker的基本概念而且容器内的网络和文件系统和宿主机是隔离的想改源码或者连数据库需要额外操作。我个人的建议是如果你只是想快速练漏洞不想折腾环境直接上Docker如果你想顺便把Web环境的配置也摸一遍或者你的Mac上Docker跑不起来比如老款Intel芯片资源紧张那就用XAMPP。下面两套方案我都会详细写。2.2 选型时容易忽略的几个点第一个是芯片架构。Apple SiliconM系列芯片和Intel芯片在Docker镜像的兼容性上是有差异的。早期很多DVWA镜像只构建了amd64架构在M系列芯片上跑会提示架构不匹配或者直接起不来。现在大部分主流镜像已经支持arm64了但你在拉镜像的时候还是要留意一下必要时加--platform参数指定。第二个是端口冲突。Mac上默认的80端口经常被其他东西占用比如你之前装过别的Web服务器或者系统自带的某些服务。XAMPP默认用80Docker映射也常用80如果冲突了要么改配置要么改映射这个后面会讲怎么排查。第三个是数据库的持久化。DVWA里你做的所有操作比如在Low等级下注入出来的数据、上传的文件都存在数据库和文件系统里。XAMPP方案下这些是持久的重启还在Docker方案下如果你没做volume映射容器一删数据就没了。练手无所谓但如果你想保留自己的测试记录就要考虑持久化。3. XAMPP方案从安装到DVWA跑起来3.1 安装XAMPP与版本选择XAMPP的官方下载页面会提供多个PHP版本的安装包。这里有个关键点DVWA对PHP版本是有要求的。老版本的DVWA在PHP 8上会报一堆弃用警告甚至致命错误因为很多老函数在新版本里被移除了。我实测下来PHP 7.4这个区间的兼容性最好DVWA的各个版本基本都能跑。如果你下载的是最新版XAMPP自带PHP 8.x可能会遇到mysql_connect之类的函数不存在的问题。所以我的建议是去XAMPP的下载页找PHP 7.4对应的安装包。如果找不到退而求其次用PHP 8.0或8.1然后准备好改DVWA源码里那些不兼容的函数调用。安装过程就是一路下一步装完之后在应用程序里能找到XAMPP的管理面板。安装完成后打开XAMPP的Application Manager你会看到Apache、MySQL、ProFTPD等几个服务。我们只需要Apache和MySQL。点Start启动它们如果状态变绿就说明起来了。这时候在浏览器访问http://localhost应该能看到XAMPP的欢迎页。注意如果Apache启动失败最常见的原因是80端口被占用。可以在终端跑sudo lsof -i :80看看是谁占着。如果是系统自带的httpd可以用sudo apachectl stop停掉如果是其他程序要么停掉它要么把XAMPP的Apache端口改成8080。3.2 部署DVWA源码DVWA的源码可以从它的官方仓库获取。下载下来是一个压缩包解压后得到一个叫DVWA的文件夹。把这个文件夹整个复制到XAMPP的web根目录路径是/Applications/XAMPP/xamppfiles/htdocs/。复制完之后理论上访问http://localhost/DVWA就能看到安装页面了。但这里有个权限问题。XAMPP的htdocs目录默认的属主和权限可能不允许你直接写入特别是DVWA需要往hackable/uploads/目录写上传的文件往config/目录写配置文件。如果权限不对你会看到Unable to write to config directory之类的报错。解决办法是给DVWA目录足够的写权限。在终端里执行sudo chmod -R 777 /Applications/XAMPP/xamppfiles/htdocs/DVWA这条命令把DVWA目录及其子目录的权限全开。在本地练手环境里这么做没问题但你要知道777在生产环境是绝对禁止的这里只是为了省事。更精细的做法是把属主改成Apache运行的用户但XAMPP在Mac下的用户配置比较绕777是最快的路子。3.3 配置数据库与完成安装DVWA需要一个数据库来存用户、漏洞配置等信息。XAMPP自带的MySQL默认root用户没有密码或者密码为空这正好方便我们配置。在DVWA目录下有个config文件夹里面有一个config.inc.php.dist文件把它复制一份改名为config.inc.php然后编辑里面的数据库配置。关键的几个参数是$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] ; $_DVWA[ db_port ] 3306;这里db_password留空是因为XAMPP的MySQL默认root无密码。如果你之前给MySQL设过密码这里要填上。db_database填dvwa如果这个库不存在DVWA的安装脚本会尝试创建它。配置好之后浏览器访问http://localhost/DVWA/setup.php页面底部会有一个Create / Reset Database按钮。点它DVWA会自动建库建表并插入初始数据。如果一切顺利你会被重定向到登录页。默认账号是admin密码是password。登录进去之后第一件事是去DVWA Security页面把安全等级设成Low然后就可以开始练了。提示如果点Create Database之后报Could not connect to the database之类的错先确认MySQL服务是不是真的在跑再确认config.inc.php里的端口和密码对不对。Mac下有时候MySQL会监听在socket而不是TCP把db_server从localhost改成127.0.0.1能强制走TCP往往能解决连接问题。3.4 XAMPP方案的实操心得用XAMPP搭DVWA我踩过最深的坑是PHP版本和DVWA版本的匹配。有一次我图省事装了最新版XAMPP结果DVWA的登录页面直接白屏打开Apache的error log一看全是PHP Fatal error原因是DVWA用了一个在PHP 8里被移除的函数。后来换成PHP 7.4的XAMPP一次就通了。所以如果你遇到白屏第一反应应该是去看/Applications/XAMPP/xamppfiles/logs/下的error_log而不是瞎猜。另一个心得是关于修改php.ini。DVWA的某些漏洞练习比如文件包含需要特定的PHP配置比如allow_url_include要打开。XAMPP的php.ini在/Applications/XAMPP/xamppfiles/etc/php.ini改完之后要重启Apache才生效。这个文件里配置项很多建议改之前先备份一份改错了能快速还原。还有一点XAMPP的MySQL有时候会因为上次没正常关闭而启动失败报错类似InnoDB: Unable to lock ./ibdata1。这时候去/Applications/XAMPP/xamppfiles/var/mysql/目录下删掉ib_logfile0和ib_logfile1这两个文件再重启MySQL通常就好了。这个操作有风险删之前最好确认没有重要数据不过练手环境里无所谓。4. Docker方案更干净的搭建方式4.1 Docker环境准备在Mac上用Docker你需要先装Docker Desktop。去官网下载对应芯片架构的安装包M系列选Apple SiliconIntel选Intel Chip装完之后启动Docker Desktop等鲸鱼图标变成稳定状态就说明Docker引擎跑起来了。在终端执行docker version能看到Client和Server的版本信息就OK。Docker Desktop在Mac上本质是跑了一个轻量级虚拟机所以它是有资源开销的。默认配置下它可能只分配了2GB内存跑DVWA这种小应用够用但如果你同时跑多个容器可能会卡。可以在Docker Desktop的Settings里调整CPU和内存分配一般给4GB内存、4个CPU就绰绰有余了。4.2 拉取并运行DVWA镜像DVWA在Docker Hub上有不少现成的镜像。比较常用的一个是vulnerables/web-dvwa这个镜像维护得比较久包含了完整的DVWA和MySQL。拉取和运行的命令是docker pull vulnerables/web-dvwa docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa第一行拉镜像第二行以后台模式启动容器把宿主机的8080端口映射到容器的80端口容器命名为dvwa。启动之后访问http://localhost:8080应该能看到DVWA的登录页。默认账号密码同样是admin/password。如果你在M系列芯片上拉这个镜像报架构不匹配的错可以试试加--platform linux/amd64参数强制用amd64架构跑通过模拟层或者找明确支持arm64的镜像。不过模拟层跑起来性能会打折扣能找原生arm64镜像最好。注意vulnerables/web-dvwa这个镜像里MySQL是内置的容器启动时会自动初始化数据库。但如果你重启容器后发现数据没了那是因为没做volume持久化。练手的话每次重置数据库反而更干净所以不持久化也无所谓。4.3 用docker-compose编排更灵活单容器方案简单但如果你想更精细地控制比如把Web和数据库拆成两个容器或者想挂载本地目录方便改源码用docker-compose会更合适。下面是一个我常用的compose配置version: 3 services: dvwa: image: vulnerables/web-dvwa ports: - 8080:80 environment: - MYSQL_ROOT_PASSWORDdvwa volumes: - ./dvwa-data:/var/lib/mysql restart: unless-stopped这个配置把MySQL的数据目录挂载到宿主机的./dvwa-data这样容器删了数据还在。restart: unless-stopped让容器在Docker重启后自动起来省得每次手动开。启动命令是docker-compose up -d停止是docker-compose down。如果你想把DVWA的源码挂载出来方便修改可以再加一个volume把/var/www/html映射到本地目录。但要注意镜像里的源码可能和官方仓库有差异挂载本地目录后要确保文件权限和路径正确否则Apache会报403或404。4.4 Docker方案的实操心得Docker方案最大的好处是环境隔离。你不用担心DVWA的PHP版本和你Mac上其他项目冲突也不用担心MySQL占着3306端口影响别的服务。容器里的世界和外面是分开的删掉容器一切归零。但有几个坑要注意。第一是端口映射如果你8080也被占了换成别的端口比如-p 9090:80然后访问http://localhost:9090。第二是容器内访问宿主机如果你在容器里想连宿主机的服务不能用localhost要用host.docker.internal这个特殊域名。第三是日志查看容器跑起来之后如果访问不了用docker logs dvwa看容器日志往往能直接看到Apache或PHP的报错。还有一个很实用的技巧如果你需要进容器里操作用docker exec -it dvwa bash就能拿到一个容器内的shell。在里面可以改配置、看文件、连数据库就像操作一台独立的Linux机器一样。练手的时候我经常进去看MySQL里的数据确认注入出来的内容到底存到哪了。5. 两种方案的对比与选择建议5.1 关键维度对比对比维度XAMPP方案Docker方案安装复杂度中等需要下载安装包并配置低一条命令拉镜像启动系统污染会往系统装Apache/MySQL/PHP几乎无污染删容器即清理环境隔离无和系统共享端口和配置完全隔离端口可自定义数据持久化默认持久默认不持久需volume映射源码修改直接改htdocs目录方便需挂载volume或进容器改资源占用较低直接跑在系统上较高Docker Desktop有额外开销版本控制受限于XAMPP自带的PHP版本镜像自带版本固定适合人群想了解Web环境构成的人想快速开练、不想折腾的人5.2 我的选择建议如果你是完全的新手我建议先用Docker方案。原因很简单快速拿到正反馈。你不需要理解Apache的配置文件在哪不需要纠结PHP版本一条命令就能看到一个能打的靶机先把漏洞练起来建立兴趣和信心。等你对DVWA本身熟悉了再回头用XAMPP方案去理解底层环境这时候你会有更具体的问题去探索学习效率更高。如果你已经有Web开发基础或者你的工作环境里本来就有XAMPP那直接用XAMPP方案更顺手。你对目录结构、配置文件、端口这些概念本来就不陌生XAMPP的直观性反而成了优势。还有一种情况是资源受限。老款MacBook内存小跑Docker Desktop可能比较吃力这时候XAMPP方案更轻量。反过来如果你的Mac上已经装了一堆开发环境端口冲突严重那Docker的隔离性就是救星。6. 常见问题与排查技巧实录6.1 数据库连接类问题问题DVWA安装时提示Could not connect to the database这是最常见的问题排查顺序是这样的。先确认MySQL服务在跑XAMPP方案看面板里MySQL是不是绿的Docker方案用docker ps看容器状态。然后确认config.inc.php里的配置重点看db_server、db_port、db_user、db_password这四项。XAMPP方案下如果MySQL监听的是socket把db_server从localhost改成127.0.0.1强制走TCP。Docker方案下如果Web和数据库在不同容器db_server要填数据库容器的服务名而不是localhost。问题登录时提示Access denied for user rootlocalhost这是密码不对。XAMPP的MySQL默认root无密码但如果你之前改过就要在config.inc.php里填对。Docker镜像的root密码可能是镜像作者设定的看镜像文档或者用docker exec进容器查。实在不行就重置MySQL的root密码XAMPP下可以用mysqladmin命令Docker下进容器操作。6.2 权限与文件类问题问题上传文件时提示Unable to write to uploads directoryDVWA的文件上传漏洞练习需要往hackable/uploads/目录写文件。如果这个目录没有写权限上传就会失败。XAMPP方案下用chmod -R 777给DVWA目录开权限。Docker方案下进容器执行同样的命令或者检查volume挂载的目录权限。问题修改config.inc.php后不生效XAMPP方案下改完配置文件不需要重启ApachePHP每次请求都会重新读配置。但如果你的改动没生效可能是改错了文件确认改的是config.inc.php而不是config.inc.php.dist。Docker方案下如果配置文件在容器里改完要重启容器或者重新构建镜像。6.3 端口与网络类问题问题访问localhost显示的是别的页面这是端口冲突。XAMPP的Apache默认80端口如果你之前装过别的Web服务器访问localhost可能指向的是那个。解决办法是改XAMPP的Apache端口在XAMPP面板的Config里改httpd.conf把Listen 80改成Listen 8080然后访问http://localhost:8080。Docker方案下改端口映射就行-p 8080:80改成-p 9090:80。问题Docker容器起来了但访问不了先用docker ps确认容器状态是Up而不是Exited。如果Exited了用docker logs dvwa看日志找原因。如果Up但访问不了检查端口映射对不对docker port dvwa能看到映射关系。还要确认Docker Desktop的网络设置没有限制端口转发有时候防火墙或者安全软件会拦截。6.4 版本兼容类问题问题DVWA页面白屏或报Fatal error这是PHP版本不兼容。DVWA的老版本在PHP 8上会挂因为用了一些被移除的函数。解决办法是降级PHP到7.4或者升级DVWA到支持PHP 8的版本。XAMPP方案下换个PHP 7.4的安装包重装。Docker方案下换个基于PHP 7.4的镜像。问题M系列芯片上Docker镜像跑不起来这是架构不匹配。用docker inspect看镜像的架构如果是amd64而你的Mac是arm64要么加--platform linux/amd64用模拟层跑要么找arm64的镜像。模拟层跑起来性能差一些但练DVWA这种轻量应用问题不大。6.5 常见问题速查表现象可能原因排查方法解决方式数据库连接失败服务未启动/配置错误检查服务状态和config文件启动服务修正配置登录被拒密码错误确认root密码填对密码或重置上传失败目录无写权限检查uploads目录权限chmod 777访问到别的页面端口冲突lsof查端口占用改端口容器访问不了容器退出/端口未映射docker ps和docker logs修复启动或映射页面白屏PHP版本不兼容看error log降级PHP或升级DVWA镜像架构不匹配芯片架构差异docker inspect加platform参数或换镜像6.6 几个独家避坑技巧第一个技巧是先跑通再折腾。很多人一上来就想改源码、加功能结果环境还没跑通就卡住了。我的建议是先用默认配置把DVWA跑起来登录进去把Low等级的每个漏洞都点一遍确认环境没问题了再去改配置、改源码。这样出问题的时候你能确定是环境本身的问题还是你改出来的问题。第二个技巧是善用日志。XAMPP的Apache错误日志在/Applications/XAMPP/xamppfiles/logs/error_logPHP错误日志在同目录的php_error_log。Docker方案用docker logs看容器日志。90%的问题在日志里都有明确提示比瞎猜快得多。第三个技巧是备份配置文件。改config.inc.php、php.ini、httpd.conf之前先复制一份加个.bak后缀。改崩了直接还原不用重新配置。这个习惯在折腾环境的时候能省大量时间。第四个技巧是Docker镜像选带标签的。不要用latest标签因为镜像更新后行为可能变化。用具体的版本标签比如vulnerables/web-dvwa:1.9这样环境是固定的今天能跑明天还能跑。7. 搭好之后怎么用DVWA练习路线建议环境搭好只是第一步怎么用它练出东西才是关键。DVWA的每个漏洞模块都有四个安全等级我的建议是按漏洞类型纵向打穿而不是按等级横向扫一遍。比如你先专注SQL注入把Low、Medium、High、Impossible四个等级都过一遍理解每个等级下防护是怎么加的、怎么绕过的。这样你对SQL注入的理解会比每个漏洞都只玩Low等级深得多。具体到每个漏洞Low等级基本就是完全不设防你按教程操作就能成功。Medium等级开始加了一些过滤比如SQL注入里用了mysql_real_escape_stringXSS里用了str_replace替换script。这些防护都有绕过方法你需要理解过滤的逻辑才能绕过。High等级防护更严比如用了预编译语句或者白名单。Impossible等级是正确写法你可以对比它和前面等级的代码差异理解什么是安全的写法。我自己的练习顺序是先命令执行和文件包含这两个最容易理解反馈也最直接然后SQL注入和XSS这两个是Web安全的重点值得花时间最后CSRF和文件上传这两个需要配合其他漏洞或者特定场景才能利用。每个漏洞练完之后去翻DVWA的源码看看它在不同等级下是怎么实现的这个看源码的环节才是真正涨功力的地方。还有一点DVWA自带的漏洞是教科书式的真实环境里的漏洞往往更隐蔽、更复杂。所以练完DVWA之后可以去找一些更接近真实的靶场继续练比如OWASP的WebGoat、或者一些CTF平台的Web题目。DVWA帮你建立的是基础概念和操作手感进阶还需要更多实战。8. 环境维护与重置练了一段时间之后你可能把数据库搞乱了或者上传了一堆测试文件想清理。XAMPP方案下重置DVWA就是重新访问setup.php点Create / Reset Database它会把数据库清空重建。上传的文件在hackable/uploads/目录下手动删掉就行。如果想彻底重来把DVWA目录删了重新解压一份再跑一遍安装流程。Docker方案下重置更简单docker rm -f dvwa删掉容器再docker run一条命令重新起一个环境就是全新的。如果你做了volume持久化删容器不会删数据要连数据一起清就删掉volume目录。这种删了重来的干净感是Docker方案最大的优势之一。最后分享一个我个人的习惯我会给每个靶机环境单独建一个目录把compose文件、配置文件、练习笔记都放在里面。这样换机器或者过段时间回来一看目录就知道这个环境是怎么搭的、练到哪了。环境搭一次不容易把搭建过程记录下来下次重建能省很多时间。踩过几次坑之后我发现搭靶机这件事本身不难难的是遇到问题时知道去哪找原因。日志、配置、端口、权限这四个方向覆盖了绝大多数问题。把这篇里的排查思路走一遍基本上没有搞不定的DVWA环境。