1. 为什么学渗透测试,先得从靶场开始
很多刚接触网络安全的朋友,最容易踩的一个坑就是:学完一堆漏洞原理,觉得自己什么都懂了,一上手却发现连工具怎么配都不知道。原因很简单,安全测试不是看出来的,是练出来的。但问题是,练习不能拿真实业务系统来练,否则轻则违反合规要求,重则直接把自己送进去。这时候,靶场就是最稳妥的练习场所。
DVWA和Pikachu是目前入门阶段最流行的两个Web安全靶场。DVWA全称是Damn Vulnerable Web Application,翻译过来就是“该死的脆弱Web应用”,它把SQL注入、XSS、文件上传、命令执行等常见漏洞做成一个个关卡,还分了低、中、高、不可能四个安全等级,非常适合循序渐进地理解漏洞背后的原理。Pikachu则是用漫画皮卡丘形象包装的一个中文靶场,基于PHP搭建,覆盖了RCE、SSRF、XXE、越权、目录遍历等二十多个漏洞场景,界面友好,中文提示清晰,对英文不太熟练的朋友尤其友好。
这篇文章我会把两个靶场的搭建过程完整拆开讲,从环境准备、下载部署、数据库初始化,到常见的排错方法,一步步带你把靶场跑起来。整个过程不需要你有很强的编程基础,只要会基本的文件操作、能打开浏览器,就能跟着搭完。搭好之后,你就有了一套可以反复练习的Web安全实验环境,后面学什么漏洞都能直接上手验证。
顺便提醒一句:靶场搭建本身是安全意识训练的一部分,搭建和使用都只能在你自己控制的、用于学习的本地环境中进行。不要在未授权的情况下对任何第三方系统做测试,这是底线。
2. 搭建前先把运行环境理清楚
2.1 两个靶场到底依赖什么
DVWA和Pikachu都是PHP写的Web应用,所以它们需要的运行环境本质上是同一套东西:Web服务器(Apache或Nginx)、PHP解释器、MySQL数据库。浏览器访问靶场页面时,Web服务器把PHP代码交给PHP解释器执行,PHP再去数据库里读写数据,最终把结果返回给浏览器。
这套流程看起来简单,但版本问题很关键。DVWA和Pikachu都是老项目,很多代码是用PHP 5.x时代的写法写的。如果你装了PHP 8.2以上的版本,很可能出现页面报错、函数不兼容甚至直接白屏的情况。这里我建议的版本组合是:PHP 5.6到7.4之间,MySQL 5.5到5.7之间,Apache 2.4。如果你用的是一体化集成环境,选带有PHP 5.6或PHP 7.x选项的版本就可以。
为什么推荐一体化环境而不是自己手动装?因为亲自编译安装Apache、PHP、MySQL确实能学到更多底层知识,但对零基础入门来说,成本太高,光是配置路径、加载扩展、处理权限就能卡住你好几天。一体化环境把所有组件打包好了,点点鼠标就能切换PHP版本,能让你把精力集中在靶场本身。等以后你有需要再回头研究底层也不迟。
2.2 Windows和Linux下的环境选择
在Windows上,比较常见的方案是使用带PHP版本切换功能的一体化面板环境。这类工具会预装Apache、Nginx、MySQL、PHP等组件,有的还能一键启动、一键切换PHP版本,对初学者非常友好。需要注意,下载这类工具时要去官方网站下载,不要用搜索引擎结果里的第三方打包版本,否则很可能捆绑了奇怪的东西。
在Linux上,建议直接用发行版自带的应用仓库安装LAMP组件,以Debian系列为例:
sudo apt update sudo apt install apache2 mysql-server php php-mysql php-gd php-mbstring libapache2-mod-php装完后启动服务:
sudo systemctl enable --now apache2 mysql然后确认MySQL和PHP之间能正常通信,最简单的验证方式是在Web根目录放一个探针文件,内容写:
<?php phpinfo(); ?>浏览器访问这个文件,如果能显示出PHP版本、扩展列表、MySQL支持信息,说明环境就绪了。这个探针文件用完记得删除,别留着当成靶场的正常页面,容易混淆。
另外提醒一个容易被忽略的点:无论是Windows还是Linux,靶场目录都要放在Web服务器能读到的位置。Windows下通常是Web根目录下的某个子目录,Linux下通常是/var/www/html/,否则浏览器访问不到。
2.3 目录结构与权限准备
把环境装好后,我建议先规划一下目录结构。例如在Web根目录下建一个labs文件夹,里面再分别放dvwa和pikachu两个子目录。这样后续访问路径就很清晰:
- 靶场地址:
http://127.0.0.1/labs/dvwa - Pikachu地址:
http://127.0.0.1/labs/pikachu
目录权限方面,Linux下需要确保Web运行账户能读取靶场文件,并且能写入某些需要动态生成的目录。跑以下命令把属主调整好:
sudo chown -R www-data:www-data /var/www/html/labsWindows下一般不存在这个权限问题,但要注意文件夹属性不要设置成只读。
3. DVWA靶场搭建完整过程
3.1 下载与目录摆放
DVWA的源码托管在一个代码托管平台上,项目会有release版本的打包下载入口。下载下来的压缩包解压后,把里面的文件全部放到刚才规划的labs/dvwa目录下。
解压完成后,进入config目录,你会发现有一个config.inc.php.dist文件。这是数据库配置的模板文件。按DVWA的官方流程,需要把它重命名成config.inc.php,然后在里面填上你的数据库信息。这一步是整个搭建过程最容易出错的地方,后面我会详细说每一项该怎么填。
在Windows上重命名文件时,如果资源管理器不显示扩展名,很容易把文件弄成config.inc.php.dist.php这种状态。建议先在文件夹选项里打开“显示文件扩展名”,再操作。Linux上直接用mv config.inc.php.dist config.inc.php就行。
3.2 数据库配置与初始化
用文本编辑器打开config/config.inc.php,你会看到类似下面的关键配置段:
$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd';这里有几项要根据你的实际数据库环境修改:
db_server:数据库地址。本地环境填127.0.0.1,如果MySQL端口不是默认的3306,可以写成127.0.0.1:3307这样的格式。db_database:DVWA要使用的数据库名,默认是dvwa,保持默认即可,后面初始化时会自动创建。db_user:数据库账号。如果用一体化环境的默认配置,通常是root。db_password:数据库密码。这个要填你实际设置的MySQL密码。很多一体化环境默认密码是root,也有的在面板设置里能看到。
改完保存文件后,打开浏览器访问http://127.0.0.1/labs/dvwa。第一次访问时会自动跳到setup.php页面,页面上会显示一些PHP扩展状态检查。如果所有检查项都是绿色,直接点页面下方的“Create / Reset Database”按钮,DVWA会创建数据库并写入默认数据。创建成功后,再访问首页就能看到登录界面。
默认登录账号是admin,密码是password,这个密码本身就是个弱口令,正好对应了靶场想让你体会的安全问题。登录成功后会看到修改密码的提示,你可以在学习过程中改成自己的密码,也可以保持默认方便反复重置。
3.3 安全级别设置与验证
登录成功后的页面上方,有一个“DVWA Security”菜单,里面可以选择安全级别。这个设置直接决定了每个漏洞关卡的难度:
- Low:没有任何防护,漏洞直接裸奔,适合理解漏洞原理。
- Medium:对输入做了简单过滤,适合练习绕过思路。
- High:防护明显增强,需要组合技巧才能绕过。
- Impossible:代码层面做了参数化查询和强校验,基本无法利用,它存在的意义是告诉你安全代码应该怎么写。
我建议初学阶段先切到Low级别,逐个漏洞模块练习,理解漏洞怎么产生、怎么利用之后,再调到Medium和High去感受防御与绕过的博弈过程。不要一上来就挑战Impossible,那会打击自信。
验证环境是否正常,可以进入SQL Injection模块,在Low级别下输入1' or '1'='1,如果页面返回了用户表的数据,说明靶场的数据库和PHP执行链路都正常。这一步能确认靶场不是只有界面能打开,而是真的可以执行漏洞练习。
4. Pikachu靶场搭建完整过程
4.1 下载与目录放置
Pikachu的获取方式同样是从托管平台下载源码包,解压后放到labs/pikachu目录。它的目录结构里有一个inc文件夹,里面放着全局配置文件config.inc.php。打开这个文件,你会看到数据库连接相关的配置:
$conf['dbhost'] = '127.0.0.1'; $conf['dbuser'] = 'root'; $conf['dbpw'] = 'root'; $conf['dbname'] = 'pikachu'; $conf['port'] = 3306;和DVWA的配置字段大同小异,dbname保持pikachu不变,dbuser和dbpw改成你自己的数据库账号密码。有一点需要特别注意:Pikachu在安装过程中会自动创建名为pikachu的数据库,所以你不需要提前建库,但数据库账号需要有创建数据库的权限。用root账号是最省事的,但既然是学习环境,也可以顺手创建一个专门账号练练MySQL授权操作。
另外,Pikachu里有些功能依赖PHP的allow_url_fopen配置,如果后面用到远程加载功能时报错,需要检查PHP的allow_url_fopen是否开启。大多数集成环境的默认配置里这个开关是打开的,暂时不需要着急改。
4.2 初始化与登录验证
配置好数据库后,浏览器访问http://127.0.0.1/labs/pikachu。首次打开会自动跳转到安装页面,通常是一个提示“初始化数据库”的按钮。点击后,Pikachu会创建数据表并写入初始数据,然后跳转到主页面。
Pikachu的大部分漏洞模块是不需要登录的,直接就能点进去练习。但“暴力破解”模块需要用到测试账号,官方默认提供了几个账号密码组合,其中就有弱口令样本,形式类似admin/123456之类的组合。实际使用时你可以在安装页面或者帮助文档里找到测试账号列表,也可以用Burp Suite抓包观察登录请求的参数结构,自己猜测和验证。
这里补充一个很多人会忽略的操作:靶场初始化完成后,建议手动打开浏览器开发者工具,看一下网络请求是否有404、500之类的异常。因为Pikachu依赖的一些静态资源如果路径写死,你把它放在子目录而不是Web根目录时,资源可能加载不出来,页面看着就会“破相”。真遇到这种情况,常见的解决方法是把Pikachu直接放在Web根目录下访问,或者修改配置里的URL前缀,具体要看源码里的路径写法。
4.3 功能模块一览与练习顺序建议
Pikachu的练习菜单是按漏洞类型组织的,其中包括但不限于:
- 暴力破解:通过Burp Suite抓包和Intruder模块进行密码枚举。
- XSS系列:反射型、存储型、DOM型,以及XSS钓鱼。
- CSRF:跨站请求伪造的GET型和POST型演示。
- SQL注入:数字型、字符型、搜索型、宽字节注入等。
- RCE:命令执行与代码执行。
- 文件包含:本地文件包含、远程文件包含。
- 文件上传:各种后缀绕过场景。
- 越权:水平越权与垂直越权。
- SSRF:服务端请求伪造。
- XXE:XML外部实体注入。
如果你是零基础,我的建议是先按“SQL注入 → XSS → CSRF → 文件上传 → RCE”这个顺序来练。这个顺序基本遵循了Web漏洞由简单到复杂的进阶路径,而且这几个漏洞类型在实际工作中出现频率也最高。Pikachu的菜单里每一项点进去都有一个“提示”区域,里面写了这个漏洞的核心原理和利用思路,卡住的时候先看提示,再自己动手。
有些模块设计了“重置”按钮,比如SQL注入模块的数据库内容可以一键重置。练习时如果数据被你改乱了,点重置就能恢复初始状态,不用重新做整个初始化流程。
5. 常见问题与排查技巧
5.1 页面白屏或直接打不开
这种情况十有八九是PHP报错但错误信息被隐藏了。你看到的白屏背后可能是一条致命错误,解决办法是临时打开PHP的错误显示开关。在靶场入口文件里临时加上:
ini_set('display_errors', 1); error_reporting(E_ALL);把这段加在PHP文件开头的<?php后面,刷新页面就能看到具体的错误信息。报错一般分两类,一类是“class not found”这种提示,说明PHP版本太高,老函数被移除了;另一类是数据库连接相关的报错,这时要去检查配置文件里的数据库账号密码有没有填对。
排查完毕记得删掉临时加的调试代码,毕竟靶场本身也是训练你排查问题能力的对象。
5.2 数据库连接失败与初始化失败
访问DVWA或Pikachu提示数据库连接错误时,优先检查配置文件里的db_user和db_password是否和MySQL实际账号匹配。有一个很隐蔽的坑是:一体化环境里MySQL服务没有启动。MySQL没有运行,你在配置里写什么都没用。先确认面板里的MySQL状态是“运行中”,再检查配置文件。
如果DVWA的setup页面点击创建数据库后报错,可能是之前已经建过dvwa库,库结构不完整导致重建失败。这时候可以手动进数据库删掉旧的库:
DROP DATABASE IF EXISTS dvwa; DROP DATABASE IF EXISTS pikachu;然后回到setup页面重新点击创建。这种方式比手动去数据库里一张一张删表要干净得多。
5.3 PHP版本太新导致的兼容性问题
如果你用的PHP版本是8.2或更高,打开靶场时大概率会遇到各种报错。最稳妥的解决方案是切换到低版本PHP。一体化环境里一般都有PHP版本切换的选项,找到运行的网站配置,把PHP版本切成7.4或5.6即可。
切完版本后,务必重启Web服务和PHP服务,否则旧的进程可能还在跑。这一点很关键,我有一次切换了PHP版本但页面还是报错,最后发现是没重启,Web服务仍然在用旧的PHP进程处理请求。
如果实在不想用老版本PHP,也可以在靶场代码里尝试修复那些过时的函数调用。但对于初学者,我强烈不建议这么做——这等于往一条陌生的路上开辟新的岔路,很容易越修越乱。直接切版本是最快到达终点的方式。
5.4 DVWA登录后显示“CSRF token mismatch”
这个问题通常出现在你对config/config.inc.php做了修改之后,或者浏览器缓存了旧的Cookie。DVWA的登录需要验证CSRF token,Cookie异常或者PHP会话数据过期都会导致校验失败。解决办法很简单:清掉浏览器里这个站点的Cookie,刷新页面重新访问。如果你改过config.inc.php里的配置,记得确认文件保存的编码是UTF-8,不要带BOM头。带BOM的文件会在输出HTML前产生不可见字符,导致页面结构和Cookie设置异常。
5.5 端口冲突导致靶场无法访问
如果你是先装了别的Web服务,再启动靶场环境,很容易出现80端口被占用的情况。Windows下可以用命令查看端口占用:
netstat -ano | findstr :80看到占用进程后,要么关掉占用程序,要么把靶场环境的Web端口改成8080或自定义端口。改端口之后,访问地址也要相应变化,例如http://127.0.0.1:8080/labs/dvwa。
5.6 Linux环境下缺少PHP扩展
Linux手动装环境时,经常出现靶场页面正常但某些功能不可用的情况,这时候排查PHP扩展是最优先的。常见需要开启的扩展包括mysqli、curl、gd、mbstring、simplexml等。安装方法:
sudo apt install php-mysql php-curl php-gd php-mbstring php-xml装完重启Apache:
sudo systemctl restart apache2然后用探针文件确认扩展状态。如果你之前看不到扩展信息,也可以在命令行里直接查看:
php -m这个命令会列出当前所有加载的PHP模块,检查起来很方便。
6. 靶场的日常使用与进阶练习建议
靶场搭好不是终点,怎么用好才是关键。我个人的习惯是给每个靶场都配一套专业的安全测试工具组合。最基础的是浏览器端抓包工具,比如Burp Suite的社区版。它的代理功能可以截获浏览器和靶场之间的HTTP请求,方便你修改参数、观察响应、做重放测试。尤其是Pikachu的暴力破解和SQL注入模块,用Burp Suite会顺畅很多。
另一个常用工具是SQLMap,它专门用来检测和利用SQL注入漏洞。但这里有个前提:SQLMap是自动化工具,它可以帮你快速验证漏洞是否存在,但如果你只会“一键扫描”而不理解背后发生了什么,那对自己的提升非常有限。我建议先手工把SQL注入的几种类型都练熟了,再让SQLMap辅助你做大规模验证,这样你才能看懂SQLMap输出里的每一段Payload在做什么。
做漏洞练习时,建议开一个Markdown笔记文件,每做完一个模块就记下:漏洞原理、利用条件、Payload、修复方案、绕过方式。这样三个月后你再回来看,整个知识体系会非常清晰。这也是我向很多来问我的朋友反复强调的方法——做靶场和刷题的本质区别就在于,靶场练习需要你提炼和沉淀,而刷题只是过一遍。
还有一点,两个靶场是可以互补使用的。同一个漏洞类型,在DVWA里过一遍低中高三个等级的理解闭环,再到Pikachu里做对应的中文提示复现,往往会有“原来如此”的感觉。比如SQL注入,DVWA的Low级别让你看到经典的单引号报错和联合查询,到了Pikachu的宽字节注入环节,你会开始理解编码转换和SQL语句解析之间的微妙关系。这种跨靶场的对照练习,比单刷一个靶场更容易建立完整的知识框架。
最后做一点收尾提醒:靶场是安全练习的起点,不是终点。真正走向实战还需要学网络协议、操作系统、数据库原理、开发语言等大量基础知识。靶场能帮你快速获得“手感”,但这些底层知识决定你在这条路上能走多远。我的建议是,每次在靶场里遇到一个报错或者一个绕过思路,都去追溯一下背后的原理,这样日积月累,你会发现自己不再只是会“打靶”,而是开始真正理解Web安全了。