PiKachu靶场实战:从原理到利用,剖析水平与垂直越权漏洞

1. PiKachu靶场环境搭建与越权漏洞初探

第一次接触PiKachu靶场时,我就被它清晰的漏洞分类吸引了。这个用PHP开发的漏洞练习平台,特别适合新手理解Web安全中的经典漏洞。搭建过程比想象中简单,只需要具备基础的LAMP/WAMP环境。我在本地测试时用的是XAMPP,把下载的靶场源码直接放到htdocs目录就能运行。记得第一次访问时,看到那个皮卡丘的logo还觉得挺亲切的。

水平越权和垂直越权是Web应用中常见的权限控制问题。简单来说,水平越权就像小区门禁卡 - 你能刷开邻居家的门(同级别用户数据互访),而垂直越权则是用普通门禁卡刷开了物业经理的办公室(低权限用户获取高权限操作)。这两种漏洞在OWASP Top 10中都属于访问控制失效的典型案例。

2. 水平越权漏洞深度解析

2.1 漏洞原理与靶场演示

在PiKachu的"Over Permission"模块,我们先登录kobe账户。查看个人信息时,注意到URL中的username参数直接暴露了查询条件。这就是典型的水平越权风险点 - 后端仅验证了登录状态,却没校验当前用户是否有权访问目标数据。

我尝试把username参数改为lucy,页面竟然返回了lucy的完整个人信息。这说明后端代码可能长这样:

$username = $_GET['username']; $sql = "SELECT * FROM users WHERE username='$username'";

这种直接使用前端传入参数且不做权限校验的代码,就是水平越权的温床。在实际开发中,正确的做法应该是:

$current_user = $_SESSION['username']; $sql = "SELECT * FROM users WHERE username='$current_user'";

2.2 实战利用与防御方案

通过Burp Suite抓包,我发现这个请求连基本的CSRF Token都没有。这意味着攻击者只需诱导受害者点击构造好的链接,就能窃取其他用户数据。更可怕的是,如果系统使用连续的数字ID,攻击者可以通过脚本批量爬取所有用户信息。

防御水平越权有这几个关键点:

  1. 始终使用会话中的用户标识而非前端参数
  2. 对敏感操作添加二次验证
  3. 实施基于角色的数据访问控制
  4. 关键操作记录详细日志

3. 垂直越权漏洞全面剖析

3.1 权限体系与漏洞成因

PiKachu靶场准备了admin和pikachu两个账号来演示垂直越权。admin拥有用户管理全权限,而pikachu只能查看信息。登录admin添加用户时,我用Burp截获了这个POST请求:

POST /pikachu/add_user.php HTTP/1.1 Cookie: PHPSESSID=admin_session_id ... username=test&password=123456&action=create

退出admin后,用pikachu账号登录并修改Cookie重放这个请求,居然成功创建了新用户!这说明后端只验证了登录状态,完全没检查用户角色权限。

3.2 漏洞利用的高级技巧

更隐蔽的攻击方式是权限提升。比如普通用户通过修改请求参数访问管理员接口:

GET /admin/delete_user.php?id=3

即使页面没有管理员入口,攻击者仍可能通过猜测路径实施操作。我曾在一个真实项目中发现,将普通用户的"修改资料"请求方法从POST改为PUT,竟然能触发管理员专属的用户封禁功能。

防御垂直越权需要:

  1. 严格的RBAC权限控制系统
  2. 敏感接口的二次鉴权
  3. 前后端统一的权限校验
  4. 定期权限矩阵审计

4. 越权漏洞的自动化检测

4.1 使用Burp Suite进行扫描

配置Burp Scanner时,我特别关注以下参数:

  • 修改用户ID等标识参数
  • 替换Cookie和Session值
  • 尝试不同HTTP方法
  • 测试未公开的API端点

在Intruder模块中,可以设置多组payload同时测试水平和垂直越权。比如同时替换用户名参数和权限级别参数。

4.2 自定义脚本检测

对于大型系统,我常用Python写自动化检测脚本:

import requests def check_vertical_privilege(url, cookies): admin_endpoints = ['/admin/user/add', '/admin/config/update'] for endpoint in admin_endpoints: res = requests.get(url+endpoint, cookies=cookies) if res.status_code == 200: print(f"垂直越权漏洞发现: {endpoint}")

5. 开发层面的修复指南

5.1 权限校验最佳实践

在最近的一个电商项目中,我们采用了这样的安全方案:

  1. 所有API请求必须携带JWT令牌
  2. 后端实现注解式权限控制
  3. 数据访问层增加租户隔离
  4. 敏感操作记录完整审计日志

Spring Security的配置示例:

@PreAuthorize("hasRole('ADMIN') or #userId == principal.id") public User getUserById(Long userId) { // 查询逻辑 }

5.2 代码审计要点

审查代码时要特别注意:

  • 直接使用前端传入的ID参数
  • 缺少@PreAuthorize等注解的接口
  • 通配符权限配置
  • 硬编码的测试账号
  • 未经验证的重定向

有次代码审计中,我发现一个危险的SQL查询:

String sql = "SELECT * FROM orders WHERE user_id=" + request.getParameter("userId");

这简直是水平越权的教科书案例。修复后改为:

String sql = "SELECT * FROM orders WHERE user_id=? AND user_id=" + currentUserId;

6. 企业级防御体系建设

在生产环境中,仅靠代码规范是不够的。我们还需要:

  1. 定期红蓝对抗演练
  2. 全链路监控异常行为
  3. 实施零信任架构
  4. 关键操作多因素认证

最近帮客户设计的安全方案中,我们在API网关层增加了实时权限校验,任何请求都要经过:

  1. JWT签名验证
  2. 权限矩阵检查
  3. 请求频率分析
  4. 行为基线比对

这套方案成功拦截了多次越权尝试,包括一次精心设计的垂直权限提升攻击。