授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、首页那句“还没有初始化”是怎么冒出来的1.1 先把官方部署说明照抄一遍Pikachu 的官方 README 把部署写成了三步原文的顺序是这样的第一步把pikachu文件夹放到 Web 服务器根目录第二步「根据实际情况修改inc/config.inc.php里面的数据库连接配置」第三步访问http://x.x.x.x/pikachu这时页面会出现一句话——「欢迎使用,pikachu还没有初始化点击进行初始化安装!」点击之后安装完成。上面两处引号里的文字本文照官方原文抄写标点原样保留。这不是较真这一小段话里藏着本文要讲的整条线索。先看它的位置。三步里前两步都是“你做的事”——把文件放到该放的地方、把连接信息改成自己环境的只有第三步出现了“点一下”这个动作而且它是由页面提示你的。换句话说初始化不是额外步骤而是靶场第一次被访问时自己提出来的。再看它的措辞。“还没有初始化”这几个字描述的是一种状态而不是一个错误。它出现在首页而不是出现在某个报错页说明在这个应用看来当前这个状态是意料之中的——文件已经就位、访问路径也是对的只是应用自己那一部分东西还没有准备好。这一点很关键很多人看到这句话会紧张以为装错了其实恰好相反它能出现在首页本身就说明前面两步大体到位了。真正需要判断的是为什么有人点了就进练习页有人点了却卡住。1.2 官方这三步各自管着哪一层把三步横向摊开看你会发现它们管的不是同一件事官方三步这一步确定下来的东西属于哪一层① 把pikachu文件夹放到 Web 服务器根目录应用从哪个路径被访问到路径层② 修改inc/config.inc.php里的数据库连接配置应用去连哪一个库、用什么身份连连接层③ 访问后点击初始化应用在它自己的库里准备出可用状态数据层三层是串起来的路径不对你根本访问不到那个页面连接信息不对页面背后那份配置就失去意义只有前两层都立住第三步才有东西可点、点了才有结果。这也是“点一下到底做了什么”值得单独写一篇的原因它看上去只是一个按钮实际站在前两层全部成立的基础上。1.3 本文要回答的三个问题点这一下究竟发生了什么为什么有人的初始化会失败为什么配置文件要“复制一份再改名”而不是直接在仓库里那份上改。范围也先说清楚本文只讲环境与配置不含任何攻击步骤、利用载荷与绕过手法不给任何具体报错文本——官方 README 没有逐字给出的本文不替它补。文中出现的命令全部标注待验证——写这篇文章的机器没有对应的运行环境。⚠️代码待验证# 官方三步的骨架照官方 README 的顺序仅作理解用未实测# 第一步把 pikachu 文件夹放到 Web 服务器根目录# 第二步根据实际情况修改 inc/config.inc.php 里面的数据库连接配置# 第三步访问 http://x.x.x.x/pikachu# 页面出现「欢迎使用,pikachu还没有初始化点击进行初始化安装!」# 点击完成安装本章可以带走的一句那句“还没有初始化”是靶场自己给出的状态提示不是报错它能出现在首页说明“文件放在哪、去连哪个库”这两层已经有了答案。二、点下去的那一步实际在做什么2.1 从官方三步反推一次顺着第一章那张表往下读第一步管路径第二步管连接第三步才轮到应用去动它自己的东西。应用要“准备自己的状态”前提是它知道自己的库在哪里、用谁的身份连上去——这正是第二步解决的事所以第三步能成立靠的是前面两步已经把信息给足了。那么这一步要落地的究竟包含哪些内容可以从“完成安装”这几个字去理解。一次安装动作要处理的绕不开与库有关的几件事库与表的结构、应用连库要用的账号、以及练习用的初始数据。这里必须把话说全官方 README 只写到“点击完成安装”这一句并未逐项展开具体有哪几个动作。上面这几项只是本文给你的理解框架不作为官方步骤陈述我也没有实际运行它去逐项观察。2.2 为什么“点完就好了”而且是一次性的把这一步想成“第一次给应用开门”。门开过一次状态就留在应用的库里了——首页下次直接就是练习页反过来只要那份记录不在首页就会回到那句话。这解释了两件事为什么它只在你第一次访问时出现——在那之前“门”还没有被开过以及为什么“重置环境”之后你会再一次见到它——记录那一层被还原了应用又回到“还没开过门”的状态。这也决定了你该怎么对待它它不是每次启动都要点一次的开关而是一次性的安装动作。既然是一次性的判断它成没成就该去看“记录有没有落下去”而不是反复点。顺便把边界交代清楚本文只讲“记录在不在库这一层”不展开容器清理、卷与数据持久化那是另一条线本文不碰。2.3 官方也提供容器方式本章只引用一次Pikachu 官方 README 除了那套“自己准备 PHPMySQL中间件”的做法也给了容器方式本地构建的写法是docker build -t pikachu .。本文只把“官方也提供容器方式”交代一次端口映射那一层不展开那有单独一篇。DVWA 的官方 README 同样给了容器用法顺序是clone 仓库 → 进入DVWA目录 →docker compose up -d它的compose.yml放在仓库根目录而不是某个子目录里。这一点和“配置放在哪”直接相关第三章会用到。⚠️代码待验证# Pikachu 官方 README 给出的本地构建写法照抄端口映射部分本文不展开dockerbuild-tpikachu.# DVWA 官方 README 给出的容器用法照抄gitclone https://github.com/digininja/DVWAcdDVWAdockercompose up-d顺序上有个细节值得留意DVWA 要求先进入DVWA目录再执行docker compose up -d——因为compose.yml在仓库根目录命令必须在能看到它的位置执行。“命令在哪执行”和“配置文件在哪”是同一条线索的两头。本章可以带走的一句那一下点的是让应用把自己的状态在库里建起来它是一次性动作所以只在你第一次访问时出现。三、为什么配置文件要“复制一份再改名”3.1 官方给的从来不是一份现成配置DVWA 官方 README 在这一步给出的做法是一条命令cp config/config.inc.php.dist config/config.inc.php。仔细读它仓库里放着的那个文件叫config.inc.php.dist而真正被应用读取的正式文件叫config.inc.php官方要你做的是把模板复制成正式文件。Pikachu 那一步在 README 里的写法不同——「根据实际情况修改inc/config.inc.php里面的数据库连接配置」文件名直接就是config.inc.php改的是里面的内容而不是文件名。两种写法表面不一样落点却是同一个你手里必须有一份属于自己环境的连接配置而且它得是能生效的那一份。3.2.dist、.example这类名字是一种通用约定配置模板的命名常见的有两种写法命名属于哪一类含义本文核到的情况*.dist模板分发样例随代码一起发布本身不直接生效需要复制成正式文件DVWA 官方 README 逐字给出的config/config.inc.php.dist*.example模板同一类约定的另一种常见写法同样属于“给你照着改的样例”属命名惯例说明本次未在靶场官方说明里逐一核对仅作概念对照为什么模板要留在仓库里、正式文件要你自己生成因为正式文件里装的是你这个环境的事实——库地址、库名、账号。这些取值因机器而异放进仓库就等于把某一个人环境里的答案发给了所有人。模板负责结构正式文件负责取值。这就是“复制一份再改名”的全部意义。3.3 复制这个动作把两件事分开了模板是仓库的、只读的、会跟着版本走正式文件是你的、可改的、不该被仓库更新覆盖。分开之后有两个直接好处应用读到的永远是你填过的那一份不会某天被一次拉取悄悄换掉出了问题你也知道该改哪个文件不必在两个几乎一样的文件之间来回猜。⚠️代码待验证# DVWA 官方 README 给出的做法未实测请按你实际仓库路径调整cpconfig/config.inc.php.dist config/config.inc.php# Pikachu 的对应动作官方 README 写作# 根据实际情况修改 inc/config.inc.php 里面的数据库连接配置本章可以带走的一句仓库里那份是模板能生效的那份要你自己复制出来“复制一份再改名”就是把官方结构和你的环境取值分成两件事。四、初始化不成功时先看哪三处4.1 第一处配置文件里的连接信息先确认两件事那份能生效的配置文件在不在——也就是有没有从模板复制成正式文件以及它里面填的连接信息是不是你这个环境的。这里最常见的错并不是值填错了而是改错了文件改的是仓库里那份模板应用读的却是另一份。文件都在、内容也对只是改的和读的不是同一份——这类“不成功”看现象和一个填错值的错误几乎一样去处却完全不同。4.2 第二处数据库里有没有那个库第二处要看的是连接信息指向的那个库本身在不在。如果连接信息是对的、目标库却不存在那“完成安装”就没有落脚的地方。要把问法说准它问的不是“数据库软件装没装”而是“连接信息里指的那个库在不在”。顺带交代一句官方在数据库这一层给出的建议DVWA 官方强烈推荐 MariaDB并且在 MariaDB 下建议为靶场新建一个库用户而不是直接使用 root。这一条和你填进配置文件的账号直接相关——用什么身份连进去决定你能看到哪些库。4.3 第三处目录挂载有没有生效容器方式下还有一层必须一起看你改的那份文件和容器里实际读到的那份是不是同一份。DVWA 官方 README 给出的做法里正好有一条与之对应想挂载本地文件需要取消# volumes: - ./:/var/www/html这一行的注释。挂载没有生效时你会在宿主上改得很认真而应用读到的还是另一份——现象就是“我明明改了它却像没改”。Vulhub 官方 README 的注意事项里也有一条同方向的提醒「请确保 Docker 有权限访问当前目录下所有文件」。文件在、权限不到位效果和“文件不在”很接近。本文只把这三处作为定位顺序列出来不给任何修复命令。顺序看什么在哪看现象级判断第一处能生效的那份配置文件在不在里面填的连接信息对不对仓库里的模板 你复制出来的正式文件改错了文件或连接信息还是别人的第二处连接信息指向的那个库在不在数据库这一层连接信息对、目标库不存在安装动作无处落脚第三处你改的文件是不是容器读到的那一份官方给出的挂载做法compose.yml里的挂载行宿主上改了、容器里没变观感等同“没改”4.4 为什么顺序是这个顺序第一处到第三处依次问的是“应用看到的是什么”“它要去的目标在不在”“你看的和它看的是不是同一个”。顺序颠倒过来你会在一个根本没被读到的文件上反复修改越改越乱。三处都过完仍然不通说明现象落在了别的地方例如运行环境本身的版本与权限。那已经超出这条顺序的范围本文不展开。⚠️代码待验证# 三处都是只读动作照着看不做任何修改# 第一处能生效的那份配置文件在不在ls-lconfig/config.inc.php config/config.inc.php.dist# 第二处连接信息指向的那个库在不在# 在数据库这一层确认本文不写任何具体查询语句# 第三处容器最终解析到的配置和你改的是不是同一份dockercompose config本章可以带走的一句三处按“配置文件 → 库 → 挂载”看顺序一旦颠倒就会在没被读到的文件上白改。五、环境跑通之后再回头看为什么要把配置和代码分开5.1 官方做法里的一条前面一直在讲“点一下”和“复制一份”这一章把镜头拉开看这些动作背后的共同取向。DVWA 官方 README 在容器相关说明里给过一条做法想让本地代码生效需要调整compose.yml里的镜像拉取策略。本文只把它作为官方的一条做法列出一次不展开它的取值含义也不做开关式的罗列。⚠️代码待验证# DVWA 官方做法照抄让本地代码生效# compose.yml 里pull_policy: always 改为 pull_policy: build5.2 分开之后环境才有“台账”可记把第三章和第四章合起来看会发现它们指向的其实是同一件事环境里“会变的东西”和“不该变的东西”要能分开。对比项放在一起分开配置文件的取值混在仓库文件里一次更新就可能被覆盖复制出来的正式文件由你填、由你管本地改动改了不一定被读到还要靠一次配置切换挂载生效后改的就是正在跑的那一份出问题的定位不知道该看哪一份文件按“配置文件 → 库 → 挂载”看三处换机器 / 重建说不清哪些是自己加的能列出“哪些是模板、哪些是我的取值”这张表不是讲哪种做法更“高级”而是讲一件更朴素的事你搭靶场是为了有一个可重复、可复盘的练习环境而不是为了让它跑起来一次。把配置和代码分开是让“重建”变简单的前提——你只需记得自己填过什么不必记得改过仓库里哪个文件。5.3 三件事其实是一件事初始化是一次性的所以它需要一个“状态”被记在某处模板复制是把“结构”和“取值”分开三处检查是把“你以为的”和“它读到的”对齐。三件事合起来就是这类环境的基本功把看不见的那一层用能复查的方式记下来。页面上看得见的是练习关卡看不见的是路径、连接、挂载和那条一次性记录——而卡住人的几乎总在后者。完整版环境对照表这一章的“配置与代码分开”对照表加上第四章的三处检查顺序、第六章的初始化检查清单我整理成了一份可以逐条对着看的资料放在资料包里扫码即可获取本章可以带走的一句官方让你把配置从代码里拿出来不是多一道手续而是让这个环境可以被重建、也可以被复述。六、一次可复用的检查顺序6.1 把顺序固定下来前面几章分头讲了三层和三个检查点这一章把它们收成一条能重复使用的顺序步骤你要确认的一句话判据1官方部署说明一共几步哪一步是“点一下”三步里初始化在第三步2能生效的那份配置文件在不在模板有没有被复制成正式文件3连接信息填的是不是这个环境库地址、库名、库账号三项是否自洽4连接信息指向的库在不在目标库存在与否5你改的与容器读到的是不是同一份挂载是否生效6那条一次性记录有没有落下去首页是否仍然提示“还没有初始化”这条顺序的价值不在于复杂而在于顺序固定卡住时照着走一遍比反复重装、反复点按钮省事每一步的结论还能直接记进环境台账下次换机器对着看。6.2 清单⚠️代码待验证# 【初始化检查顺序 · 只看不改】# 1. 官方部署说明一共几步哪一步是“点击初始化”# 2. 能生效的那份配置文件在不在# 例config/config.inc.php 是否由 .dist 复制而来# 3. 它的连接信息是不是我这个环境的# 4. 连接信息指向的那个库在不在# 5. 我改的这份和容器读到的是不是同一份挂载# 6. 记录没落下去时首页会继续提示“还没有初始化”6.3 这份顺序不覆盖什么第一不覆盖任何具体报错文本——官方 README 没有逐字给出本文也没有实测因此一句都不写。第二不覆盖各靶场的版本要求——Pikachu 官方 README 只写了“PHPMYSQL中间件如 apache, nginx 等”未给出任何版本号本文不替它补。第三不覆盖容器清理、卷与数据持久化也不覆盖端口映射与访问地址。第四不覆盖任何攻击步骤、利用载荷与绕过手法。截至 2026-10-02本文引用的事实仍以台账核验日 2026-09-16 的官方 README 内容为准页面会变化建议按附表 A 的出处自己复检一遍。本章可以带走的一句从“官方一共几步”开始按“配置文件 → 库 → 挂载 → 记录”走一遍比反复重装省事。七、收束7.1 把那一下拆开开头那句「欢迎使用,pikachu还没有初始化点击进行初始化安装!」之所以值得单独写一篇是它把一个看不见的过程压缩成了一个按钮。点下去之前应用已经通过配置文件知道“自己的库在哪”点下去之后它把自己的状态在库里建起来首页从此进入练习页。Pikachu 官方 README 给自己的定位是「Pikachu是一个带有漏洞的Web应用系统在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习那么Pikachu可能正合你意。」顺带一提它官方 README 上的版本号徽章是version-1.0。本文只借它说明“初始化这一步在部署流程里的位置”不展开它的维护状态也不把它当作靶场推荐。7.2 四组对照你以为的实际发生的该看哪里页面上写着“还没有初始化”是装坏了那是预期状态说明前两步大体已到位官方部署三步点一下只是刷新了页面那一下是让应用把自己的状态建起来库这一层配置文件直接在仓库里那份上改就行官方要的是先把它复制成正式文件再改.dist这类模板我改了配置却没反应很可能改的和读的不是同一份挂载是否生效7.3 边界和这个账号的其他文章一样本文守住几条线不写任何攻击步骤、利用载荷与绕过手法不写任何具体报错文本不写任何量级数字不写端口映射、容器清理与数据持久化。Vulhub 官方 README 注意事项里那句「所有环境仅供测试与学习严禁用于生产环境」也是本文对读者的同一条提醒。自己搭靶场时的初始化自检清单第四章的三处检查、第六章的六步顺序我做成了一份可以逐条打勾的清单连同各靶场官方 README 的原文出处放在资料包里扫码即可获取本章可以带走的一句把“点一下”当成一次有前因后果的安装动作来看你就不会再把它当成魔法。附表 A本文引用事实与官方出处对照表核验日期统一为2026-09-16以官方 README 当日内容为准出处照抄共用事实台账。页面会变化建议按表中出处自己复检一遍。#事实陈述一手出处来源名 URL核验日期本文位置1Pikachu 官方 README 部署三步逐字①把pikachu文件夹放到 Web 服务器根目录②「根据实际情况修改inc/config.inc.php里面的数据库连接配置」③访问http://x.x.x.x/pikachu出现「欢迎使用,pikachu还没有初始化点击进行初始化安装!」点击完成安装Pikachu 官方 README — https://raw.githubusercontent.com/zhuifengshaonianhanlu/pikachu/master/README.md2026-09-16一、1.1二、2.12Pikachu 官方定位逐字「Pikachu是一个带有漏洞的Web应用系统在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习那么Pikachu可能正合你意。」同第 1 行2026-09-16七、7.13Pikachu 官方 README 版本号徽章为version-1.0同第 1 行2026-09-16七、7.14Pikachu 官方 README 给出的容器方式之一本地构建docker build -t pikachu .本文只引用一次端口映射不展开同第 1 行「Docker」2026-09-16二、2.35DVWA 官方 Docker 用法clone → 进入DVWA目录 →docker compose up -dcompose.yml位于仓库根目录DVWA 官方 README — https://raw.githubusercontent.com/digininja/DVWA/master/README.md2026-09-16二、2.36DVWA 官方做法cp config/config.inc.php.dist config/config.inc.php把配置模板复制成正式文件同第 5 行2026-09-16三、3.1、3.37DVWA 官方做法取消# volumes: - ./:/var/www/html注释以挂载本地文件同第 5 行2026-09-16四、4.38DVWA 官方做法把compose.yml里pull_policy: always改为pull_policy: build让本地代码生效本文仅列出一次同第 5 行2026-09-16五、5.19DVWA 数据库官方强烈推荐 MariaDBMariaDB 下不能用 root 用户需新建库用户同第 5 行「Database Setup」2026-09-16四、4.210Vulhub 官方 NOTE 逐字「请确保 Docker 有权限访问当前目录下所有文件」Vulhub 官方 README中文— https://raw.githubusercontent.com/vulhub/vulhub/master/README.zh-cn.md2026-09-16四、4.311Vulhub 官方 NOTE 逐字「所有环境仅供测试与学习严禁用于生产环境」同第 10 行2026-09-16七、7.312未实测项某靶场“初始化失败”时的具体报错文本——官方 README 未逐字给出本文也未实测故全文不写任何报错文本本文未实测DVWA / Pikachu 官方 README 逐条核对无对应表述2026-09-16全文13待验证项Pikachu 官方 Docker 镜像当前是否仍可拉取——台账记为待验证本次未能核实 Docker Hub本文因此不写“能拉到”一类结论台账 表 B-补 PB2 — https://hub.docker.com/r/8023/pikachu-expect2026-09-16二、2.314待验证项Pikachu 具体的 PHP / MySQL 版本要求——官方 README 未给任何版本号本文因此不写任何版本号Pikachu 官方 README 台账 PB12026-09-16六、6.3附表 B术语速查表术语是什么为什么在本文里重要初始化向导靶场首次访问时由页面提示你点一下的那个安装动作它是本文的主角一次性、只在第一次出现.dist/.example模板随代码发布的配置样例文件需复制成正式文件才生效解释“为什么配置文件要复制一份再改名”配置文件记录“连哪个库、用什么身份连”的那份文件官方三步里的第二步也是三处检查的第一处连接信息配置文件里的库地址、库名、库账号等取值它指向的库在不在是第二处检查要回答的挂载让容器读到宿主上那份文件的机制挂载不生效时“我改了却没反应”就会出现一次性动作只发生一次、结果被记在别处的操作解释为什么初始化只在第一次访问时出现库数据库应用存放自己状态的所在初始化那一下的落脚点环境台账把自己填过、改过的环境事实记成可复查清单让环境可重建、可复述代码待验证本文标记该命令未在本机实际运行过写文章的机器没有对应运行环境如实标注写在最后这篇用到的资料写这篇文章时我把 Pikachu 官方 README 的部署三步、DVWA 官方 README 里和配置、挂载有关的那几条做法连同 Vulhub 官方 README 的注意事项逐字核了一遍才发现“点一下初始化”背后站着的其实是配置与代码怎么分开这件事——顺手也整理了几份配套的东西靶场初始化自检清单三处检查 六步顺序逐条可打勾靶场环境对照表DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径Web 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看靶场初始化自检清单那一份——先把“点一下之前该确认什么”记下来比等页面卡住了再回头翻文档要省心得多。