Pikachu靶场实战:深入理解与挖掘越权漏洞
2026/7/8 16:31:15 网站建设 项目流程

1. 项目概述:为什么Pikachu是理解越权漏洞的绝佳起点

如果你刚开始接触Web安全,或者对“越权漏洞”这个概念感觉既熟悉又模糊,那么从Pikachu靶场入手,绝对是一个明智的选择。我见过太多安全新人,一上来就扎进复杂的真实环境或综合性靶场,结果被各种干扰项弄得晕头转向,基础没打牢,反而留下了知识漏洞。Pikachu靶场的设计初衷,就是化繁为简,它把像越权漏洞这样的核心安全风险,单独剥离出来,给你一个纯净、可控的环境去“折腾”。

所谓越权漏洞,用大白话讲,就是“你干了你不该干的事儿”。系统本应严格区分每个用户的权限边界——普通用户只能看自己的信息,管理员才能管理所有人——但如果在设计或编码时留下了逻辑缺陷,就可能让一个普通用户绕过限制,执行高权限操作,或者访问其他用户的私密数据。这听起来简单,但在实际复杂的业务逻辑里,它往往隐藏得很深。Pikachu靶场的好处在于,它直接把这个漏洞“摆”在你面前,让你能像做解剖实验一样,清晰地看到漏洞的成因、利用手法以及修复的关键点。

这次实战,我们不只满足于“点一下按钮就成功”的复现。我会带你从零开始,搭建Pikachu靶场,然后深入其越权漏洞模块,拆解水平越权和垂直越权这两种核心类型。更重要的是,我们会站在攻击者和防御者两个角度去思考:攻击者是如何一步步发现并利用这个漏洞的?他的每一步操作背后有什么意图?而作为开发者或安全工程师,又应该在代码的哪个环节设置检查点,才能从根本上堵住这个漏洞?这个过程,远比单纯记住一个漏洞利用的Payload有价值得多。

2. 环境准备与Pikachu靶场搭建详解

工欲善其事,必先利其器。在开始“攻防”之前,我们得先把“战场”布置好。Pikachu靶场本质上是一个用PHP写的Web应用,所以我们需要一个标准的PHP运行环境。

2.1 基础运行环境搭建

最省心、兼容性最好的方案是使用集成环境包,比如PHPStudy或XAMPP。这里以PHPStudy V8.1版本为例,因为它对Windows用户非常友好,且自带多种PHP版本切换,方便我们应对不同情况。

首先,去PHPStudy官网下载安装包并完成安装。安装路径建议不要有中文和空格,比如D:\phpstudy_pro。安装完成后,启动PHPStudy,你会看到它的主界面。我们需要做两件事:启动Apache(或Nginx)和MySQL服务。通常点击对应的“启动”按钮即可,状态变绿说明服务运行正常。

接下来是关键一步:选择PHP版本。Pikachu靶场对PHP版本有一定要求,推荐使用PHP 5.4至PHP 7.0之间的版本。太老的版本可能缺少某些函数,太新的版本(如PHP 8.x)则可能因为语法不兼容而报错。在PHPStudy的“软件管理”或“环境”选项卡里,可以很方便地安装和切换PHP版本。我个人的经验是,PHP 5.6.9 或 PHP 7.0.9 这两个版本与Pikachu的兼容性最好,几乎不会出问题。

注意:如果你在启动Apache时遇到端口冲突(比如80端口被占用),可以在PHPStudy的“其他选项菜单” -> “PHPStudy设置” -> “端口常规设置”中,修改Apache的端口,例如改为8080。后续访问靶场就需要用http://localhost:8080

2.2 Pikachu源码部署与数据库初始化

环境准备好后,我们来部署靶场源码。从Pikachu的官方GitHub仓库下载最新的ZIP压缩包。解压后,你会得到一个名为pikachu-master的文件夹。将这个文件夹整个复制到PHPStudy的网站根目录下。网站根目录的路径通常在PHPStudy安装目录下的WWW文件夹里,例如D:\phpstudy_pro\WWW

为了便于访问,我习惯将文件夹重命名为简单的pikachu。这样,靶场的访问地址就是http://localhost/pikachu(如果你改了端口,就是http://localhost:8080/pikachu)。

现在打开浏览器访问这个地址。如果环境配置正确,你应该能看到Pikachu的安装引导界面。页面会提示你数据库连接失败,这是正常的,因为我们还没有配置数据库。

点击页面上的“安装/初始化”按钮。Pikachu的安装脚本会自动完成两件重要的事:

  1. 创建数据库和表:它会在你的MySQL中创建一个名为pikachu的数据库,并导入所有必需的数据表。
  2. 生成配置文件:它会在靶场目录下生成一个inc/config.inc.php文件,里面写入了数据库的连接信息(主机、用户名、密码、数据库名)。

这里有一个至关重要的实操细节:MySQL的默认密码。PHPStudy安装的MySQL,其root用户的初始密码通常是root。如果安装脚本报错,提示数据库连接失败,十有八九是密码不对。你需要手动检查并修改配置文件。找到pikachu/inc/config.inc.php文件,用记事本打开,你会看到类似下面的内容:

define('DBUSER','root'); define('DBPWD','root'); // 检查这一行,密码可能为空‘’或者是‘root’ define('DBNAME','pikachu'); define('DBHOST','localhost'); define('DBPORT','3306');

确保DBPWD的值与你本地MySQL的root密码一致。如果不确定,可以打开PHPStudy,在“MySQL管理器”中查看或修改密码。

修改保存配置文件后,刷新浏览器安装页面,再次点击“安装/初始化”。看到“安装成功”的提示后,整个Pikachu靶场就搭建完毕了。你可以点击“进入主页”开始我们的漏洞探索之旅。

3. 越权漏洞核心原理与分类深度拆解

在动手之前,我们必须把理论地基打牢。越权漏洞(Broken Access Control)在OWASP Top 10中长期位列前列,其危害性在于它直接破坏了系统的权限模型。我们可以从两个维度来理解它:水平越权垂直越权。Pikachu靶场对这两种类型都有非常典型的案例。

3.1 水平越权:同级用户间的权限僭越

水平越权,也叫作“访问控制缺失(Insecure Direct Object References, IDOR)”。想象一下,在一个论坛里,每个用户都有一个唯一的用户ID。你的个人资料页的URL可能是http://example.com/user.php?id=123,而我的可能是id=124。水平越权漏洞就发生在,系统只在前端页面上隐藏了指向其他用户资料的链接,却没有在后台接口真正校验“当前登录的用户是否有权查看id=124的资料”。

攻击本质:攻击者通过修改请求参数(如URL中的ID、表单中的隐藏字段、API请求体中的JSON数据)来访问属于其他同级用户的数据或功能。关键在于,系统在进行数据操作时,没有将请求者的身份(Session或Token)与要操作的数据对象(通过ID标识)进行绑定校验。

Pikachu靶场中的体现:在“越权漏洞(over permission)”模块下,有一个“水平越权”案例。场景通常是一个查看个人信息的页面,URL中带有一个id参数。漏洞就在于,后端代码直接信任了这个id,执行了类似SELECT * FROM users WHERE id = $_GET[‘id’]的查询,而没有先判断$_SESSION[‘user_id’]是否等于$_GET[‘id’]

3.2 垂直越权:低权限用户获取高权限功能

垂直越权比水平越权更危险。它指的是一个低权限角色(如普通用户)能够执行本应只有高权限角色(如管理员)才能执行的操作。例如,普通用户本应只能在前台浏览文章,但却能通过某种方式访问到后台管理员的文章审核页面,甚至直接调用后台的管理接口。

攻击本质:系统对功能或页面的访问控制存在缺陷。可能的原因包括:

  1. 基于前端隐藏的“伪防护”:仅通过前端UI隐藏了管理员功能链接或按钮,但对应的后端API接口URL依然可以被猜测或抓包获取。
  2. 缺失功能级权限校验:在进入关键功能控制器(Controller)或处理函数时,没有校验当前用户的角色或权限码。
  3. 配置错误:Web服务器(如Nginx/Apache)或应用框架的路由配置错误,导致本应受保护的目录或文件被直接访问。

Pikachu靶场中的体现:在“垂直越权”案例中,通常会模拟两个用户:lucy(普通用户)和admin(管理员)。以lucy身份登录后,虽然页面上看不到“添加用户”的管理员功能,但攻击者可以通过浏览器开发者工具(F12)查看网络请求,或者根据经验猜测管理员添加用户的URL(如/admin/add_user.php),然后直接尝试访问或构造请求,如果成功,就构成了垂直越权。

3.3 一个常被忽略的混合类型:上下文相关越权

在实际审计中,还有一种更隐蔽的类型,它混合了水平和垂直的特点,我称之为“上下文相关越权”。例如,在一个电商系统中,用户A可以查看自己订单的物流详情(水平权限),但物流详情接口里可能包含了“修改物流状态”的按钮或链接(这是一个垂直权限功能)。如果系统没有在渲染这个按钮时,结合“当前用户角色”和“当前订单状态”进行双重校验,那么用户A就可能看到并触发这个本应只属于客服或管理员的按钮。

理解这些原理后,我们再去看Pikachu靶场的代码,就能一眼看出问题所在。它的价值就在于,把这些有缺陷的代码模式赤裸裸地展示给你看。

4. 水平越权漏洞实战攻击与代码审计

现在,让我们进入Pikachu靶场,亲手触发一个水平越权漏洞。打开靶场主页,找到左侧的“越权漏洞(over permission)” -> “水平越权”。

4.1 攻击流程复现与每一步的意图分析

  1. 正常登录与观察

    • 首先,我们用系统提供的测试账号lucy/123456进行登录。登录成功后,页面可能会显示“欢迎 lucy”以及一些个人信息。
    • 关键动作:留意浏览器地址栏。你很有可能会看到一个包含用户ID参数的URL,例如http://localhost/pikachu/vul/overpermission/op1/op1_mem.php?uid=1。这个uid=1就是当前用户lucy在数据库中的唯一标识。这一步的目的是定位用于标识用户的关键参数
  2. 参数篡改与试探

    • 我们将URL中的uid参数值从1改为2,然后回车访问。
    • 意图分析:我们假设用户id=2是另一个用户(比如lili)。这个操作是在试探后端逻辑:“你是直接根据我提供的uid去数据库查数据,还是会先检查一下这个uid是不是我本人(当前登录的lucyuid)?”
    • 结果预测:如果页面显示的内容变成了“欢迎 lili”以及lili的隐私信息(如电话、邮箱),那么水平越权漏洞就实锤了。这说明后端代码毫无校验。
  3. 深入利用与信息收集

    • 漏洞确认后,攻击不会停止。攻击者可能会写一个简单的脚本,自动遍历uid从1到1000,批量抓取所有用户的敏感信息。
    • 更进一步:如果这个页面不仅有查看功能,还有通过GET/POST参数执行的“修改个人信息”功能,那么攻击者就可以通过篡改uid和其他参数(如email,phone),来篡改任意用户的数据,危害从信息泄露升级为数据篡改。

4.2 后端漏洞代码深度解析

攻击成功了,我们来看看靶场“故意”留下的漏洞代码。找到对应的PHP文件(根据URL路径通常是pikachu/vul/overpermission/op1/op1_mem.php)。

你会看到类似下面这样问题代码的核心片段:

// 假设这里已经开始了Session, $_SESSION[‘username’] = ‘lucy’; $uid = $_GET[‘uid’]; // 直接接收用户输入的参数 $sql = “SELECT * FROM users WHERE id = ‘{$uid}‘ LIMIT 1”; $result = mysqli_query($link, $sql); $row = mysqli_fetch_assoc($result); echo “用户名:” . $row[‘username’]; echo “邮箱:” . $row[‘email’]; // … 输出其他敏感信息

漏洞根因:代码直接使用了未经校验的$_GET[‘uid’]来构建SQL查询。它完全没有将请求中的$uid与当前登录用户的身份(存储在$_SESSION[‘user_id’]里)进行比对。正确的逻辑应该像这样:

session_start(); $current_uid = $_SESSION[‘user_id’]; // 从Session中获取当前登录用户的真实ID $request_uid = intval($_GET[‘uid’]); // 获取请求的ID,并转为整数防注入 if ($current_uid != $request_uid) { die(‘权限不足,无法查看他人信息。’); // 核心校验! } // 只有ID一致,才执行查询 $sql = “SELECT * FROM users WHERE id = {$current_uid} LIMIT 1”; // … 后续操作

实操心得:在审计代码时,看到一个外部传入的ID参数被直接用于数据查询,你的安全警报就应该立刻响起。必须追踪这个参数是否与当前用户的身份凭证进行了绑定校验。这种校验必须放在服务端,任何前端(JavaScript)的校验都是不可信的。

5. 垂直越权漏洞实战攻击与路径探测

垂直越权的攻击思路与水平越权不同,它更侧重于发现隐藏的功能接口

5.1 攻击流程:从普通用户到管理员

  1. 低权限会话建立

    • 使用普通用户账号(如lucy/123456)登录系统。仔细浏览所有可见的菜单和页面,用浏览器开发者工具的“网络(Network)”面板记录下所有的请求。
  2. 功能接口猜测与探测

    • 基于目录结构:很多老式PHP应用的管理后台就在/admin//manage//backend/目录下。直接尝试访问http://localhost/pikachu/admin/
    • 基于常见功能名:添加用户的功能,可能叫add_user.php,user_create.php,saveUser.action。修改权限的功能,可能叫grant.php,edit_role.php
    • 基于参数动作:观察普通用户功能点的URL模式。如果普通用户修改自己信息的URL是edit_info.php?action=update,那么管理员批量操作的可能就是edit_info.php?action=admin_update
  3. 直接访问与权限绕过

    • 在保持lucy登录状态(即Session有效)的情况下,在浏览器新标签页直接输入你猜测的管理员功能URL。
    • 结果分析
      • 如果直接跳转到了登录页或提示权限不足,说明后端有基本的权限校验。
      • 如果成功进入了管理员页面,或者更糟糕,直接显示了管理员功能界面并可以操作,那么垂直越权漏洞就存在了。这意味着系统只检查了“用户是否登录”,但没有检查“登录的用户是什么角色”。

5.2 后端漏洞代码逻辑缺失分析

垂直越权的后端代码问题通常出在入口控制器或路由分发器。例如,一个admin_add_user.php的文件,开头可能只有:

session_start(); if (!isset($_SESSION[‘username’])) { header(‘Location: login.php’); exit; } // 缺少了关键的角色检查! // if ($_SESSION[‘role’] != ‘admin’) { die(‘Forbidden’); } // 下面是执行添加用户的管理员逻辑

这段代码只验证了“是否登录”,没有验证“是否是管理员”。正确的做法是在所有需要特权操作的入口处,进行基于角色(Role)或权限(Permission)的强制检查。

注意事项:在现代的MVC框架(如ThinkPHP, Laravel, Spring Security)中,垂直权限检查通常通过“中间件(Middleware)”、“拦截器(Interceptor)”或“注解(Annotation)”来实现。审计时,要检查这些控制层的代码是否覆盖了所有需要保护的管理路由,是否存在配置遗漏。Pikachu靶场用简单的PHP文件模拟了这种配置遗漏的场景。

6. 漏洞防御:从开发到运维的立体化方案

理解了如何攻击,我们才能更好地防御。修复越权漏洞不是一个单点动作,而是一套需要在软件开发生命周期(SDLC)中贯彻的体系。

6.1 开发编码阶段的核心防御策略

  1. 实施“最小权限原则”与强制访问控制

    • 所有功能点默认拒绝:在设计之初,所有API接口、控制器方法的默认权限应该是“拒绝”,然后显式地为特定角色授予权限。
    • 使用统一的权限检查中间件:不要在每个函数里都写一遍权限判断代码。抽象出一个权限检查函数或中间件,在路由层或控制器入口处统一调用。例如,在Laravel中可以使用GatePolicy
  2. 服务端绑定会话与对象所有权

    • 这是防御水平越权的黄金法则。永远不要信任客户端传来的对象ID。在执行任何数据操作(增删改查)前,必须增加一步校验:
      // 伪代码示例 function getUserOrder($orderIdFromClient) { $userId = getCurrentUserIdFromSession(); // 从可信源(Session)获取当前用户ID $order = Order::where(‘id’, $orderIdFromClient)->first(); if (!$order || $order->user_id != $userId) { // 校验数据所有权 throw new AccessDeniedException(); } return $order; }
    • 对于复杂的查询,尽量在SQL的WHERE条件中直接加入用户ID约束,而不是先查出数据再判断。
      SELECT * FROM orders WHERE id = {input_id} AND user_id = {session_user_id}
  3. 基于角色的访问控制(RBAC)与基于属性的访问控制(ABAC)

    • RBAC:适合权限模型相对固定的系统。为用户分配角色(如管理员、编辑、访客),为角色分配权限。在代码中检查if (user.hasRole(‘admin’))if (user.can(‘delete_user’))
    • ABAC:更灵活,适合复杂场景。权限决策基于用户属性(角色、部门)、资源属性(文档状态、所属项目)、环境属性(时间、IP)等多个属性。例如,“允许文档的创建者在工作时间内,从公司内网,编辑状态为‘草稿’的文档”。这需要更复杂的安全策略引擎。

6.2 测试与运维阶段的加固措施

  1. 自动化安全测试

    • DAST(动态应用安全测试):使用ZAP、Burp Suite等工具进行主动扫描,配置扫描策略重点检测越权漏洞。可以手动设置两个不同权限的账号,让工具自动对比两者的访问能力差异。
    • IAST(交互式应用安全测试):在测试环境中部署IAST探针,在QA进行功能测试时,实时分析代码执行流和数据流,能更精准地发现潜在的权限校验缺失点。
  2. 代码审计与同行评审

    • 将“权限校验”作为代码审查清单中的必查项。重点关注所有包含用户ID、资源ID等参数的API接口、服务层方法。
    • 使用静态代码分析工具(SAST),并为其编写或启用专门检测“未经验证的重定向”、“不安全的直接对象引用”等问题的规则。
  3. 运维监控与日志审计

    • 在应用程序日志中,详细记录所有敏感操作(登录、数据访问、权限变更)的操作者、时间、IP、操作对象(如资源ID)、操作结果
    • 建立异常访问告警机制。例如,同一个用户账号在短时间内尝试访问大量不同ID的资源,或者一个低权限账号尝试访问已知的管理员接口路径,这些行为日志都应该触发告警,以便安全团队及时介入调查。

防御越权漏洞是一场持久战,它要求开发、测试、运维和安全团队协同工作。从编码时的一行校验代码,到上线后的每一行监控日志,共同构成了系统权限安全的护城河。

7. 实战进阶:使用Burp Suite系统化挖掘越权漏洞

手工测试适合理解原理,但面对成百上千个功能点,我们需要更高效、更系统化的工具和方法。Burp Suite是Web安全测试的“瑞士军刀”,用它来辅助越权测试事半功倍。

7.1 配置测试环境与会话管理

  1. 浏览器代理设置:将浏览器(如Chrome)的代理设置为127.0.0.1:8080,指向Burp Suite。
  2. 捕获登录流量:在Burp中确保“Intercept is on”。用低权限账号(lucy)登录Pikachu靶场。Burp会捕获到登录的POST请求。将这个请求发送到“Repeater”模块,方便后续重放。同时,将这个请求发送到“Scanner”模块进行被动扫描。
  3. 会话管理:Burp的会话管理功能(Project options->Sessions)非常重要。我们需要为两个不同的用户(lucyadmin)创建独立的会话处理规则,让Burp能自动为每个用户的请求维护各自的Cookie或Token,避免手动切换的麻烦。

7.2 使用“Compare Site Maps”功能进行差异对比

这是发现垂直越权最有效的自动化方法之一。

  1. 以低权限用户身份爬取站点地图

    • 在Burp的Target->Site map中,右键点击你的靶场域名,选择“Spider this host”。或者,更推荐手动浏览网站所有lucy能访问的页面,让Burp自动记录流量。
    • 浏览完成后,站点地图里就是lucy视角下的整个应用结构。右键站点地图,选择“Save selected items”,将其保存为一个XML文件,命名为sitemap_lucy.xml
  2. 以高权限用户身份爬取站点地图

    • 清除浏览器和Burp的缓存、Cookie。
    • 在Burp中,切换到“Proxy” -> “Options”,找到“Match and Replace”规则,可以临时添加规则清空Cookie头,确保是一个全新的会话。
    • 用管理员账号(admin/123456)登录并完整浏览网站,特别是那些只有管理员才能看到的后台管理页面。
    • 同样,将管理员视角的站点地图保存为sitemap_admin.xml
  3. 对比分析

    • 在Burp的Target选项卡下,有一个“Compare site maps”功能。加载刚才保存的两个XML文件。
    • Burp会高亮显示两者之间的差异。那些只出现在sitemap_admin.xml中而不在sitemap_lucy.xml中的URL,就是潜在的管理员专属接口。这些URL就是垂直越权测试的核心目标清单

7.3 使用Burp Intruder进行水平越权批量测试

对于发现的一个疑似存在水平越权的接口(如/api/getUserInfo?id=),我们可以用Intruder进行自动化参数爆破。

  1. 定位请求:在Proxy历史记录或Repeater中,找到包含目标参数(如id)的请求。
  2. 发送到Intruder:右键请求,选择“Send to Intruder”。
  3. 设置攻击类型与载荷位置
    • 在“Positions”标签页,清除所有自动标记,然后手动将id参数的值标记为载荷位置。攻击类型(Attack type)选择“Sniper”即可。
  4. 配置载荷
    • 切换到“Payloads”标签页。在“Payload type”中选择“Numbers”。
    • 设置数字范围,例如从1到100,步长为1。这代表我们将尝试遍历id从1到100的用户信息。
  5. 开始攻击与结果分析
    • 点击“Start attack”。Intruder会使用当前活跃的会话(即lucy的会话)批量发送请求。
    • 攻击完成后,我们需要重点关注“Length”或“Status”列。如果所有请求返回的HTTP状态码都是200,且长度各不相同,这强烈暗示着水平越权漏洞的存在——因为lucy的会话成功获取到了其他ID用户的数据。
    • 我们可以进一步查看响应内容,确认是否真的包含了不同用户的敏感信息。

通过Burp Suite这套组合拳,我们可以将越权漏洞的挖掘从手动、随机的试探,转变为系统化、自动化的检测流程,极大提升了测试的覆盖率和效率。

8. 总结与反思:从靶场到真实世界的思维转变

在Pikachu靶场里,漏洞被精心设计并放在显眼的位置,我们能够按图索骥,轻松复现。但真实世界的应用远比这复杂。权限校验可能分散在多个层级——前端路由守卫、后端控制器注解、服务层方法、甚至数据库存储过程。业务逻辑也错综复杂,一个“删除”操作,可能不仅需要检查用户是否有删除权限,还要检查数据的状态、所属部门等属性。

因此,走出靶场后,我们需要建立更立体的安全思维。在代码审计时,要像攻击者一样思考,寻找每一个外部输入参数与权限校验逻辑之间的断点。在设计系统时,要秉持“默认拒绝”和“最小权限”的原则。在测试时,不要只满足于正向用例,更要设计大量异常和越权用例。

我个人在多年的渗透测试中有一个深刻体会:越权漏洞的根源,常常不是技术难题,而是意识缺失和逻辑疏忽。开发者在专注于实现复杂的业务功能时,很容易忘记在某个不起眼的查询接口里加上一句if (currentUser != targetUser)。而这恰恰是安全工程师的价值所在——用攻击者的视角去审视整个系统,补上这些缺失的逻辑链条,在功能实现与安全边界之间建立起坚固的防线。Pikachu靶场的实战,正是训练这种视角和思维的绝佳第一步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询