1. 为什么我把pikachu靶场装进虚拟机,而不是直接跑在主机上
第一次搭pikachu靶场,卡住人的往往不是漏洞本身,而是物理主机上的浏览器死活打不开虚拟机里那个页面。地址栏敲127.0.0.1,转圈到超时;换成虚拟机的IP,提示无法访问;好不容易首页出来了,CSS和图片全丢,点进模块清一色404。这些问题看着五花八门,根因其实就三类:网络模式选错、端口没放行、站点根目录指向不对。把这三件事理清楚,pikachu靶场搭建就是十几分钟的事。
pikachu(圈内习惯叫皮卡丘靶场)是一套用PHP写的Web漏洞练习平台,把SQL注入、XSS、CSRF、文件包含、反序列化、SSRF这些常见Web安全问题拆成一个个独立模块,每个模块都配了刻意留出缺陷的页面。它的价值不在于"能跑起来",而在于给你一个可以放心乱点的环境——参数改成什么、请求重放多少次,都不影响任何真实业务。
这篇内容面向刚接触网络安全、想在自己机器上把pikachu跑起来的人,也适合装过一遍但总觉得环境"半通不通"的人。整套流程我会拆成两段:虚拟机内部Web环境的搭建,以及物理主机到虚拟机的访问链路打通。后者是很多教程一笔带过、但真正让人放弃的部分。
1.1 靶场本身就是个"脏环境",别让它碰你的日常系统
pikachu的设计目标就是"能被攻破",代码里到处是故意的缺陷,数据库账号密码也常常是弱口令。这种环境放在物理主机上跑,等于把一个没锁门的屋子盖在自己家门口。更现实的问题是:练注入的时候你会反复往数据库里塞奇怪字符,练文件上传的时候会往Web目录丢各种测试文件,练反序列化的时候可能触发一堆PHP报错日志。主机上的开发环境、浏览器保存的密码、甚至一些日常软件的数据,都可能在你不注意的时候被牵连。
放到虚拟机里的好处很直接:它是一个可以被随意弄脏、弄坏了直接删掉重来的盒子。练完一个模块拍张快照,玩崩了回滚,三十秒回到干净状态。这种"随便作"的自由度,才是靶场真正该有的使用姿势。
另外还有一个很实际的考虑——物理主机访问虚拟机这个结构,本身就模拟了真实渗透测试里的位置关系:你的攻击机(主机)和靶机(虚拟机)是两个独立的IP。等你后面想加Burp Suite抓包、想玩arp欺骗、想拿nmap扫端口的时候,这个双机结构不用重建,直接就能用。
1.2 三种网络模式先想明白,再动手装系统
VMware给虚拟机提供了三种主要网络模式,选哪种直接决定了物理主机能不能访问到靶场。很多人装完系统才想起来研究这个,结果发现虚拟机拿不到IP,或者主机ping不通,又回头重装。
| 网络模式 | 虚拟机IP来源 | 主机能否访问虚拟机 | 虚拟机能否上网 | 适合场景 |
|---|---|---|---|---|
| 桥接(Bridged) | 和主机同网段的独立IP | 能,双向互通 | 能 | 有线网络、需要被局域网其他机器访问 |
| NAT | VMware虚拟网段(如192.168.60.x) | 能,但需要端口映射 | 能 | 无线网络、只想主机自己访问 |
| 仅主机(Host-only) | VMware虚拟网段 | 能 | 不能 | 完全离线、纯隔离练习 |
我的建议很直接:如果你用的是笔记本连WiFi,优先选NAT加端口映射;如果是有线连接,桥接最省事。原因后面在第四章会详细展开,这里先记住一个结论——桥接模式在部分无线网卡上会拿不到IP,这是硬件层面的限制,不是配置写错了,换NAT能立刻解决。
虚拟机安装本身没什么技术含量,一路下一步就行。但有两个细节值得注意:一是系统盘给到40GB以上,phpStudy加MySQL加日志,20GB很快见底;二是内存至少给2GB,1GB的虚拟机跑Apache和MySQL会卡到你怀疑人生。
1.3 动手前的清点:软硬件清单与版本取舍
在真正开始之前,把要用的东西列清楚,能省掉后面大量的返工。下面这张清单是我自己常用的组合,实测下来稳定性最好。
- 虚拟化软件:VMware Workstation 16或17,版本不用追新,稳定优先
- 靶机系统:Windows Server 2012/2016,或者Windows 7/10精简版;Linux系可选CentOS 7、Ubuntu 20.04
- Web环境:Windows下用phpStudy(小皮面板),Linux下用LNMP或宝塔
- PHP版本:7.0到7.3之间最稳
- 数据库:MySQL 5.5或5.7
- 靶场源码:pikachu开源仓库打包文件
- 浏览器:主机侧准备一个独立浏览器或独立配置文件,专门用来访问靶场
这里特别说一句PHP版本。很多教程只写"PHP 5.4以上",实际装的时候你如果装了PHP 8.0,会发现pikachu部分模块直接白屏或者报致命错误——它里面有些写法依赖较老的数据库扩展和语法,PHP 8把一些废弃特性彻底移除了。反过来,PHP 5.3以下会因为语法太老跑不起来。7.0到7.3这个区间是经过大量人验证的甜点区,phpStudy的面板里可以直接切版本,装完先切好再部署代码,能少踩一大半坑。
提示:虚拟机的系统语言建议用中文或英文都可以,但Web目录路径千万别带中文和空格。"D:\我的靶场\pikachu"这种路径在Apache配置里是灾难,后面排查样式丢失问题时能把你绕进去。
2. 虚拟机内部的Web运行环境怎么搭才不返工
环境搭建这一步,Windows和Linux两条路线差别挺大,但核心逻辑是一样的:一个能解析PHP的Web服务器,一个能连上的MySQL,一个指向正确位置的站点根目录。这三件事有一件没弄对,pikachu的安装页就出不来。下面按我的实际操作顺序讲,Windows路线为主,因为用物理主机访问虚拟机的场景里,Windows靶机占比最高,也最容易上手。
2.1 phpStudy与LNMP:两条路线的取舍逻辑
先说结论。如果你只是想快速把pikachu跑起来,Windows加phpStudy是最短路径:图形界面点几下,Apache、MySQL、PHP全装好,站点根目录、端口、PHP版本切换都在面板里操作,不需要碰命令行。缺点是Windows下Apache的权限模型和Linux差别比较大,你练文件包含、文件上传这类模块时,遇到的路径问题和真实Linux服务器不太一样。
如果你的目标是贴近真实生产环境,Linux加LNMP更值。CentOS或Ubuntu装好之后,用宝塔面板或者手写nginx配置,再单独装PHP和MySQL。这条路前期麻烦一点,但练命令执行、权限提升、反弹shell这类模块时,环境更真实,能学到的细节也更多。
我的做法是:先在一台Windows虚拟机上把pikachu跑通,摸清整个部署流程;然后再用Linux虚拟机重建一遍。第一遍熟悉流程,第二遍理解差异。两套环境都拍快照留着,后面写笔记或者做对比的时候随时能切回去。
2.2 PHP版本与模块兼容性:那些装完才发现的报错
phpStudy面板默认可能给你一个比较新的PHP版本,比如7.4或者8.x。装完pikachu之后,你大概率会遇到下面这几类问题:
第一类是白屏或者500错误。访问install.php,页面一片空白,浏览器什么都不显示。这时候不要瞎猜,去看Apache的错误日志(phpStudy的日志目录下),十有八九是PHP的致命错误,比如调用了在当前版本里已经不存在的函数。
第二类是数据库连接失败。错误信息通常是"Access denied"或者"无法连接到MySQL服务器"。这个多半是config.inc.php里的账号密码和实际MySQL的账号密码对不上,或者MySQL根本没启动。
第三类是部分模块能打开、部分模块报错。这种最迷惑人,其实说明版本本身能跑,但个别模块的写法在PHP 7.4以上被判定为废弃。解决办法很简单——在phpStudy里把PHP版本切到7.0或7.3,重启Apache,问题大概率消失。
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| 首页白屏、500 | PHP版本过高,函数不存在 | 切到PHP 7.0-7.3 |
| 提示数据库连接失败 | 账号密码不匹配或MySQL未启动 | 核对config.inc.php并启动服务 |
| 个别模块报错 | 语法废弃警告 | 切低版本PHP,或关闭错误显示 |
| 页面能开但全是乱码 | 数据库字符集不是utf8 | 建库时指定utf8编码 |
注意:不建议为了"跑起来"去修改pikachu的源码。改一处,后面遇到的所有报错你都会怀疑是不是自己改坏了。版本问题用版本解决,这是最省心的思路。
2.3 MySQL初始化与站点根目录的初始化
phpStudy装好后默认自带MySQL,账号密码通常是root/root。这里要做两件事:确认MySQL服务在运行,以及为pikachu准备一个独立的数据库。
数据库可以先不建,因为pikachu的安装向导会帮你建库建表。但MySQL服务必须能正常启动,否则安装向导走不下去。如果面板里显示MySQL启动失败,最常见的原因是端口冲突——你主机或者虚拟机里已经有一个MySQL占用了3306。处理方式是在phpStudy里改MySQL端口,同时记得config.inc.php里的端口也要跟着改。
站点根目录这块是重点。phpStudy默认的WWW目录通常是D:\phpstudy_pro\WWW,你把pikachu解压后的文件夹整个拖进去,最终路径是D:\phpstudy_pro\WWW\pikachu。访问地址就是http://虚拟机IP/pikachu/。
但这里有个细节,很多人喜欢在phpStudy里新建一个站点,把根目录直接指向D:\phpstudy_pro\WWW\pikachu。这么做的好处是访问时不需要带/pikachu后缀,直接http://虚拟机IP/就到首页。坏处是如果pikachu的代码里有相对路径引用(比如../inc/config.inc.php这种),站点根目录变更后可能引用错位,导致部分页面加载不出来。
我的建议是:先用默认WWW目录加子文件夹的方式跑通,确认所有模块都能打开;之后再考虑要不要配独立站点。先通后优,别一上来就折腾配置。
Apache这边还有两个配置项值得检查。一是监听端口,默认80;如果你主机上IIS或者别的软件占了80,虚拟机里也可能因为其他服务占着,那就改成8080,访问时带端口。二是AllowOverride,pikachu有些模块依赖.htaccess文件,需要把对应目录的AllowOverride设为All,否则这些模块会返回404或者403。
# Linux环境下快速检查80端口是否被占用 netstat -tlnp | grep :80 # Windows靶机命令行下检查 netstat -ano | findstr :80如果输出里有别的进程占用80,要么停掉那个进程,要么把Apache改到8080。前者更干净,后者更安全(不影响其他服务)。改完端口记得重启Apache,然后在主机侧访问时把端口带上。
3. 把pikachu源码放进去并完成数据库初始化
环境通了之后,接下来的操作就很快了:放代码、改配置、走安装向导、验收。这一步看着简单,但有几个位置改错一个字符,就会让你在"数据库连接失败"这个提示上耗半小时。
3.1 源码的获取与目录摆放
pikachu是开源项目,在代码托管平台上搜项目名就能找到作者维护的仓库,下载打包文件解压即可。解压后你会看到类似这样的目录结构:
pikachu/ ├── inc/ # 配置和公共函数 ├── pkxss/ # XSS相关模块 ├── vul/ # 各类漏洞模块目录 ├── install.php # 安装向导 ├── index.php # 首页 └── ...把整个pikachu文件夹原样放进Web根目录,不要只挑几个文件复制。很多人为了"干净"只拿了部分目录,结果首页能开、点进模块就404,就是因为模块目录没拷全。
还有一点:解压出来的文件夹名字不要改。有些压缩包解开后是pikachu-master,你手动改成pikachu是可以的,因为访问路径跟着变就行;但如果改成带中文或者带空格的名字,Apache处理路径时容易出问题,尤其是后面配伪静态和.htaccess的时候。
3.2 config.inc.php里真正需要改的字段
配置文件在inc/config.inc.php,用文本编辑器打开,你会看到几个关键变量。我按重要性排序说:
- $DBHOST:数据库主机地址。因为数据库和网站跑在同一台虚拟机里,这里保持
localhost或127.0.0.1就行,不要改成主机的IP,否则会连不上 - $DBUSER / $DBPW:数据库账号密码,默认root/root,要和phpStudy里MySQL的实际配置一致
- $DBNAME:数据库名,通常是pikachu,安装向导会自动创建
- $PIKA_ROOT_DIR:项目根目录的相对路径,一般保持默认的
../../即可
这里最容易踩的坑是账号密码。phpStudy某些版本的默认MySQL密码不是root,或者你之前改过却忘了。核对方式很简单:在phpStudy面板的MySQL管理里看当前账号信息,或者在命令行里用mysql -uroot -p试一下能不能登进去。
另一个坑是端口。如果你把MySQL从3306改到了别的端口,config.inc.php里也要对应调整,有些版本用的是$DBHOST="localhost:3307"这种写法。改完保存,别用记事本存成UTF-8带BOM的格式,那会在PHP里产生一个隐藏字符,导致页面顶部多出一行空白,进而引发"headers already sent"这类奇怪报错。用VS Code或者Notepad++,编码选无BOM的UTF-8。
3.3 安装向导走完后的验收动作
浏览器访问http://虚拟机IP/pikachu/install.php,会看到一个初始化页面,点安装按钮,它会自动建库建表并写入初始数据。看到"安装成功"的提示后,做三件事确认环境真的好了:
第一,删掉或改名install.php。这是习惯问题,也是安全意识的一部分——虽然靶场本身是隔离的,但留着安装入口是坏习惯,练手时也该按真实项目的规范来。
第二,逐一点开首页上的模块列表。不要只看首页能开就觉得大功告成。SQL注入、XSS、文件包含、反序列化、SSRF这些模块,各点进去一个页面,确认都能正常显示表单和内容。这一步能提前发现"部分模块404"这类问题。
第三,检查数据库里是否真的写入了数据。在phpStudy的数据库管理工具里打开pikachu库,看看是不是有一堆pk_开头的表。有表有数据,说明初始化完整;只有空库,说明安装向导中途失败了,需要看日志找原因。
4. 打通物理主机到虚拟机的访问链路
到这里,虚拟机内部的靶场已经在http://127.0.0.1/pikachu/能访问了。但物理主机上的浏览器还是打不开——因为你访问的是主机自己的127.0.0.1,而靶场在另一台机器上。这一章讲的就是怎么把这条链路接上,也是整个教程里最关键的部分。
4.1 桥接模式:拿到一个和主机同网段的IP
桥接模式的逻辑很好理解:虚拟机就像你局域网里新接进来的一台电脑,从路由器那里自己拿一个IP,和你的物理主机平起平坐。配置方式是在VMware里把虚拟机的网络适配器设为"桥接模式",然后进虚拟机里确认IP。
在Windows靶机上打开命令提示符,输入ipconfig;Linux靶机输入ip addr。找到IPv4地址,比如192.168.1.105。然后回到物理主机,打开浏览器访问http://192.168.1.105/pikachu/。如果一切正常,页面就出来了。
桥接模式的好处是双向透明:主机能访问虚拟机,虚拟机也能访问主机,局域网里其他设备也能访问这台靶机。方便是方便,但有两个坑要提前知道。
第一个坑是WiFi环境下的桥接不稳定。部分无线网卡的驱动在桥接模式下拿不到DHCP分配的IP,表现就是虚拟机里ipconfig出来的地址是169.254.x.x这种自动私有地址。这不是配置错了,是网卡层面的兼容问题,换有线或者改用NAT模式就好。
第二个坑是IP会变。路由器重启、DHCP租期到了、你换了WiFi,IP都可能变。每次都去虚拟机里查一遍很烦。解决办法是在路由器里给这台虚拟机的MAC地址绑定固定IP,或者干脆改用NAT模式——NAT下虚拟机IP由VMware自己管,相对稳定。
4.2 NAT加端口映射:无线环境下我更推荐的方案
NAT模式下,虚拟机处于VMware创建的一个独立网段(通常是192.168.x.0/24,网关是VMnet8的地址),它能上网,但外部(包括物理主机)默认访问不到它。要让主机能访问,就得做端口映射。
配置路径是:VMware菜单栏"编辑" → "虚拟网络编辑器" → 选中VMnet8(NAT模式那一项) → 点"NAT设置" → 在"端口转发"里添加一条规则:
- 主机端口:8080(随便选一个没被占用的)
- 类型:TCP
- 虚拟机IP地址:靶机的IP,比如192.168.60.128
- 虚拟机端口:80
保存之后,在物理主机浏览器里访问http://127.0.0.1:8080/pikachu/,流量就会通过主机8080端口转发到虚拟机的80端口。
这个方案看起来比桥接多了一步配置,但优势很明显:不受无线网卡影响,虚拟机IP由VMware管理,主机侧的访问地址永远是127.0.0.1加端口,不用每次查IP。对笔记本用户来说,这是最省心的方案。
需要注意的一个细节是:端口转发配好之后,主机侧访问用的是127.0.0.1,但在靶机内部,数据库连接仍然写localhost,这是两个独立的通信路径,不要混为一谈。
4.3 仅主机模式配合主机的转发方案:离线练习的选择
如果你追求的是绝对的隔离——比如你想在一个完全断网的虚拟机里练手,不希望它有哪怕一点访问外网的可能——那就用仅主机模式。这个模式下虚拟机只能和物理主机通信(前提是主机上装了VMnet1虚拟网卡),默认上不了外网。
它的问题在于虚拟机装不上依赖、下不了工具。所以常见的做法是给虚拟机配两张网卡:一张仅主机模式用于主机访问,一张NAT模式用于临时上网。平时把NAT那张网卡禁掉,需要联网时再启用。
这种配置对新手来说有点绕,我的建议是:先用NAT方案把整套流程跑通,等到你需要做严格隔离的实验时,再回来折腾仅主机模式。不要一上来就把自己绕进网络配置的迷宫里。
4.4 三条命令验证链路,比反复刷新浏览器靠谱
很多人排查访问问题的方式是反复刷新浏览器,看页面出不出来。这个方式信息量太少,页面出不来的时候你完全不知道是哪一层断了。更高效的做法是按层次用命令验证。
# 第一步:主机能不能ping通虚拟机(验证网络层) ping 192.168.60.128 # 第二步:目标端口通不通(验证传输层) # Linux/macOS主机 nc -vz 192.168.60.128 80 # Windows主机用PowerShell Test-NetConnection 192.168.60.128 -Port 80 # 第三步:应用层能不能返回内容 curl -I http://192.168.60.128/pikachu/这三步的排查逻辑是层层递进的。ping不通,说明网络模式或者IP有问题;ping通了但端口不通,说明是防火墙或者Apache没监听;端口通了但curl返回404,说明站点路径配错了。按这个顺序查,你永远知道自己卡在哪一层。
提示:Windows靶机的防火墙默认会拦截外部的80端口访问,这是最常见的"ping得通但端口不通"的原因。在靶场虚拟机里可以直接关闭防火墙(隔离环境下风险可控),或者建立一个入站规则放行TCP 80端口。
5. 页面打不开或者打开不对:一套完整的排查链路
链路打通之后还有些问题会冒出来,而且形态各异:有的是空白页,有的是403,有的是页面能开但样式全丢。这些问题的排查思路不一样,混在一起猜会浪费大量时间。下面按我实际遇到的顺序,把每一类的根因和处理方式讲清楚。
5.1 从ping不通到端口不通:先确定卡在哪一层
假设主机访问http://192.168.60.128/pikachu/,浏览器超时。按上一节的命令逐个走。
ping不通的情况,先看虚拟机里的IP是不是169.254开头——如果是,说明网络适配器没拿到地址,检查VMware的网络设置,或者把网络适配器在NAT和桥接之间切一下再切回来(相当于重新拔插网线)。如果虚拟机IP正常,但主机还是ping不通,检查主机上的VMnet网卡是不是被禁用了,在"网络和共享中心"里看看有没有VMware的虚拟网卡被禁用。
ping通、端口不通的情况,九成是防火墙。Windows靶机上打开"高级安全Windows防火墙",在入站规则里找有没有放行80端口;没有就新建一条。Linux靶机上检查firewalld或者ufw的状态,CentOS 7默认是开的,直接systemctl stop firewalld临时关掉,或者用firewall-cmd --add-port=80/tcp --permanent永久放行。
还有一种情况是端口通了、返回403。这通常是Apache配置里的目录权限问题。检查httpd.conf里站点目录的Require设置,Apache 2.4之后要用Require all granted,写成老版本的Allow from all可能不生效。另外确认目录下确实有index.php,文件名大小写在Linux上是要区分大小写的。
5.2 样式丢失、跳转错乱与URL里的IP不一致
页面能打开,但CSS、图片、JS全加载不出来,页面变成一堆纯文本——这是新手最容易被吓到的问题之一,其实原因特别简单。
打开浏览器的开发者工具,切到Network面板,刷新页面,看那些红色的失败请求的URL是什么。如果URL是http://localhost/xxx.css或者http://127.0.0.1/xxx.css,那就说明问题了:pikachu的部分页面里引用了硬编码的地址,或者用了相对路径但你的访问方式不对。
处理方式分两种。如果是相对路径引起的,检查你访问的URL层级对不对。假设你访问的是http://192.168.60.128/pikachu/vul/sqli/sqli_str.php,页面里引用../../assets/style.css,那么解析出来是http://192.168.60.128/pikachu/assets/style.css,这是对的。但如果你把站点根目录直接配成了pikachu文件夹,访问http://192.168.60.128/vul/sqli/sqli_str.php,两级相对路径就解析到了网站根目录之外,资源自然404。
所以我一直建议用"WWW根目录+pikachu子目录"的方式部署,就是为了让各类相对路径的引用关系保持在作者设计时的样子。
5.3 跳转错乱:URL被写死的几个位置
比样式丢失更烦的是跳转错乱。点一个链接,跳到了http://localhost/pikachu/xxx,浏览器直接找不到地址。这种情况通常是因为页面里用了PHP的$_SERVER['HTTP_HOST']或者硬编码的域名。
如果确认是某个模块页面里有硬编码,最干净的做法是去配置文件里找有没有全局的站点地址变量。pikachu这类靶场通常会把基础URL集中在配置文件里,改一处就全生效。如果确实是散落在各个模块里写死的,那就在访问时保持路径结构一致,尽量少改代码。
这里插一句经验:不要在练习用的靶场上做"美化"和"重构"。你不是在做一个要上线的产品,你是在一个故意留洞的练习场里学东西。改得越多,你后面遇到问题时越分不清是靶场本身的设计如此,还是你自己改出来的新问题。
5.4 为后续抓包测试做准备:代理要指向虚拟机的IP
环境搭好之后,下一步大概率是要用Burp Suite之类的工具抓包做题。这里有一个特别容易忽略的点:如果你在主机浏览器里用127.0.0.1访问靶场,Burp是抓不到流量的,因为对localhost的请求默认不经过代理。
正确做法是用虚拟机的实际IP(桥接模式下)或者主机映射端口(NAT模式下)来访问,同时把浏览器代理指向Burp的监听地址。这样请求就会先到Burp,Burp转发给靶场,你在Burp里就能看到完整的请求和响应。
抓到包之后,做题时记得一个原则:先看原始请求,再动手改。很多人一上来就各种构造payload,结果连正常的请求长什么样都没看清,最后分不清是payload不对还是请求本身发错了。
| 问题现象 | 排查入口 | 常见根因 |
|---|---|---|
| 浏览器超时 | 主机ping虚拟机 | 网络模式选错、VMnet网卡被禁用 |
| 端口不通 | nc或Test-NetConnection | 靶机防火墙未放行 |
| 返回403 | Apache错误日志 | 目录权限配置或缺少index |
| 样式全丢 | 浏览器Network面板 | 站点根目录层级不对 |
| 跳转到localhost | 查看页面源码 | 基础URL被硬编码 |
| Burp抓不到包 | 检查访问地址 | 用了127.0.0.1而不是虚拟机IP |
6. 用久之后才慢慢明白的几件事
环境搭起来只是开始,用久了会发现一些"文档里不会写,但影响体验"的细节。这些经验没什么高深的技术含量,但能让你少走不少弯路。
6.1 快照是这套环境里最值得用的功能
虚拟机跑通pikachu之后,第一件事是拍一张快照,名字就叫"环境就绪"。之后每做完一个模块、装完一个新工具、改完一份配置,都可以再拍一张。练崩了、手滑删了文件、数据库塞满了垃圾数据,回滚一下就行,比重新装一遍快太多。
我自己的习惯是分层拍:一张"纯净系统"、一张"Web环境就绪"、一张"靶场部署完成"、一张"工具配置完成"。这样不管哪一层出问题,都能精确回滚到最近的一个干净状态,不用从头再来。
6.2 靶场环境的边界感
pikachu是故意留洞的系统,它不属于"可以放在公网上"的东西。桥接模式下虚拟机直接暴露在局域网里,如果你的实验环境不止你一个人用,最好确认一下这个IP不会被别人扫到,或者干脆用NAT模式只让主机自己访问。
另外一点是关于数据。不要用你自己的常用密码去初始化靶场的数据库,也不要在靶场环境里保存任何真实的账号信息。练SQL注入的时候你会往数据库里插各种测试数据,练文件上传的时候会往Web目录丢各种测试文件,这些东西混在一起,将来清理起来很麻烦。给靶场单独建一套假数据,用完直接删虚拟机,这是最干净的方式。
6.3 从pikachu扩到DVWA、sqli-labs时的复用技巧
这套环境搭好之后,你会发现它不止能跑pikachu。把DVWA的源码解压到同一个WWW目录下,访问http://虚拟机IP/dvwa/就能跑;sqli-labs同理。它们的依赖都是PHP+MySQL,环境完全共用。
唯一需要注意的是数据库名和配置文件名不要冲突。DVWA的配置在config/config.inc.php里,sqli-labs的在sql-connections/db-creds.inc里,各自改各自的账号密码就行。三个靶场可以同时在同一个WWW目录下共存,互不影响。
这种"一套环境跑多个靶场"的做法,好处是你只需要维护一份虚拟机快照,练不同类型的漏洞时切模块就行,不用来回启不同的虚拟机。等到你需要练更复杂的场景——比如内网渗透、多层网络拓扑——再考虑用多台虚拟机搭拓扑,那时候这套单机环境的经验会直接派上用场。
6.4 关于"装不上"这件事的另一个视角
最后分享一个心态上的东西。搭靶场这类环境,遇到各种报错是常态,而且这些报错大部分跟你要学的安全知识没有直接关系——它们是运维和网络配置层面的问题。很多人卡在这里就放弃了,觉得"连环境都装不好,还学什么安全"。
其实换个角度看,这套排查过程本身就是很有价值的训练。你为了搞清楚为什么ping不通而去理解网络模式,为了搞清楚为什么403去读Apache配置,为了搞清楚为什么数据库连不上去看日志文件——这些能力在真实渗透测试里天天都在用。靶场搭建不是学习的前置成本,它本身就是第一课。
我个人的习惯是:每搭建一个新环境,都把过程中遇到的报错、排查思路、最终解决方案记在一个文档里。攒到后面你会发现,这份文档比任何教程都有用,因为它是你自己踩过的坑,每一条都带着具体的场景和上下文。pikachu这套环境的记录,我现在还留着,后来换新电脑重建时直接照着走,四十分钟就复现完了。