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,攻击者可以通过脚本批量爬取所有用户信息。
防御水平越权有这几个关键点:
- 始终使用会话中的用户标识而非前端参数
- 对敏感操作添加二次验证
- 实施基于角色的数据访问控制
- 关键操作记录详细日志
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,竟然能触发管理员专属的用户封禁功能。
防御垂直越权需要:
- 严格的RBAC权限控制系统
- 敏感接口的二次鉴权
- 前后端统一的权限校验
- 定期权限矩阵审计
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 权限校验最佳实践
在最近的一个电商项目中,我们采用了这样的安全方案:
- 所有API请求必须携带JWT令牌
- 后端实现注解式权限控制
- 数据访问层增加租户隔离
- 敏感操作记录完整审计日志
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. 企业级防御体系建设
在生产环境中,仅靠代码规范是不够的。我们还需要:
- 定期红蓝对抗演练
- 全链路监控异常行为
- 实施零信任架构
- 关键操作多因素认证
最近帮客户设计的安全方案中,我们在API网关层增加了实时权限校验,任何请求都要经过:
- JWT签名验证
- 权限矩阵检查
- 请求频率分析
- 行为基线比对
这套方案成功拦截了多次越权尝试,包括一次精心设计的垂直权限提升攻击。