Phpcms v9.6.0 逻辑漏洞:越权重置任意用户密码

Phpcms v9.6.0 逻辑漏洞:越权重置任意用户密码详解

一、前言

在 Web 应用中,逻辑漏洞因其隐蔽性和高危害性而备受关注。Phpcms v9.6.0 存在一个严重的认证绕过逻辑漏洞,攻击者可通过伪造 Cookie 中的 xxx_reguserid 值,越权触发密码重置邮件功能,从而重置任意用户(包括管理员)的密码,且无需登录即可实施攻击。这一漏洞可能导致系统完全沦陷,危害极大。

本文基于靶场环境,详细复现 Phpcms v9.6.0 的密码重置逻辑漏洞,涵盖环境搭建、漏洞原理、利用流程及防护建议,旨在帮助安全从业者和开发者深入理解逻辑漏洞的成因与防范措施。

学习目标

  • 掌握逻辑漏洞的原理与危害
  • 学会利用 Cookie 伪造实现越权操作
  • 理解密码重置流程中的安全设计缺陷
  • 掌握修复逻辑漏洞的最佳实践

二、漏洞概述

  • 漏洞类型:认证绕过 / 越权密码重置(逻辑漏洞)
  • 影响版本:Phpcms v9.6.0
  • 靶场环境
    • 操作系统:Windows 7 虚拟机
    • Web 环境:PhpStudy + Phpcms v9.6.0
    • 靶站地址http://192.168.56.104
  • 危害
    • 无需认证即可重置任意用户密码(包括管理员)
    • 批量获取用户账号控制权
    • 导致系统完全失控
  • 利用条件
    • 伪造 Cookie 中的 xxx_reguserid
    • 控制目标用户的邮箱地址
  • 难度:中等(需了解 Cookie 构造和密码重置流程)

三、靶场环境搭建

1. 环境信息

  • 操作系统:Windows 7(虚拟机)
  • Web 环境:PhpStudy(集成 PHP + MySQL)
  • 靶站地址http://192.168.56.104
  • 靶场软件:Phpcms v9.6.0
  • 测试工具
    • Burp Suite(抓包与 Cookie 获取)
    • Firefox(登录测试用户)
    • Google Chrome(伪造 Cookie)
    • 两个邮箱(如 QQ 或 163 邮箱,用于接收重置邮件)

2. 部署步骤

  1. 安装 PhpStudy
    • 在 Windows 7 虚拟机中安装 PhpStudy,配置 PHP 和 MySQL 环境。
    • 确保 Web 服务监听在 192.168.56.104:80
  2. 部署 Phpcms v9.6.0
    • 下载 Phpcms v9.6.0,解压到 PhpStudy 的 WWW 目录。
    • 访问 http://192.168.56.104 完成安装,配置数据库连接。
  3. 注册测试用户
    • 创建一个以 “1” 开头的用户,例如:
      • 用户名1abc
      • 密码:任意(如 123456
      • 邮箱attacker@qq.com(攻击者控制的邮箱)
    • 确保目标系统存在管理员账户(如 admin,邮箱为 admin@qq.com)。

四、漏洞原理剖析

1. 漏洞本质

Phpcms v9.6.0 的密码重置功能存在以下逻辑缺陷:

  • Cookie 伪造:服务端根据 Cookie 中的 xxx_reguserid 字段判断用户身份,但未验证用户是否已登录或该字段是否合法。
  • 验证流程缺失:攻击者可伪造 xxx_reguserid(如设置为 1,对应管理员用户 ID),向任意邮箱发送重置密码邮件。
  • 无关联校验:系统未验证 xxx_reguserid 是否与目标邮箱地址绑定,导致攻击者可为任意用户(如 admin)发起密码重置。

2. 利用链

1
伪造 Cookie(xxx_reguserid) -> 访问重置邮件发送接口 -> 指定目标邮箱(如 admin@qq.com) -> 接收重置邮件 -> 重置密码 -> 控制账户

3. 危害

  • 无需认证:攻击者无需登录即可触发密码重置。
  • 任意用户控制:可重置管理员或其他用户密码,获取完整系统权限。
  • 批量攻击:通过遍历用户 ID,批量发送重置邮件,控制多个账户。

五、漏洞利用流程

1. 准备阶段

  • 邮箱准备
    • 攻击者邮箱:attacker@qq.com(用于注册测试用户)
    • 目标邮箱:admin@qq.com(管理员账户绑定的邮箱,需可控)
  • 注册测试用户
    • 用户名:1abc
    • 密码:任意(如 123456
    • 邮箱:attacker@qq.com
  • 工具
    • Burp Suite(抓取 Cookie)
    • Firefox(登录测试用户)
    • Google Chrome(伪造 Cookie)
    • 邮箱客户端(接收重置邮件)
  1. 登录 1abc 账户
    • 使用 Firefox 访问 http://192.168.56.104,登录用户 1abc
  2. 抓取 Cookie
    • 打开 Burp Suite,配置代理(默认:127.0.0.1:8080)。
    • 访问任意页面(如首页),在 Burp 中拦截请求。
    • 找到 Cookie 中的 xxx_username 字段,例如:
1
xxx_username=MWFiYw==
  • 说明MWFiYw== 是用户名 1abc 的 Base64 编码值。
  1. 复制 Cookie
    • 记录 xxx_username=MWFiYw==,用于后续伪造。

3. 伪造 Cookie(控制台操作)

  1. 打开 Chrome
    • 使用 Google Chrome(无需登录任何账户)。
    • 访问靶站首页:http://192.168.56.104
  2. 伪造 Cookie
    • F12 打开开发者工具,切换到 Console 面板。
    • 输入以下命令:
      1
      document.cookie="xxx_reguserid=MWFiYw==";
    • 目的:通过伪造 xxx_reguserid,让系统误认为当前请求来自用户 1abc
  3. 验证 Cookie
    • 在 Console 中输入 document.cookie,确认 Cookie 已设置:
      1
      xxx_reguserid=MWFiYw==

4. 触发密码重置邮件

  1. 访问重置邮件接口
    • 在 Chrome 中访问以下 URL,指定管理员邮箱:
      1
      http://192.168.56.104/index.php?m=member&c=index&a=send_newmail&siteid=1&newemail=admin@qq.com
    • 参数说明
      • m=member&c=index&a=send_newmail:触发密码重置邮件发送功能。
      • siteid=1:站点 ID(通常为默认值 1)。
      • newemail=admin@qq.com:目标账户的邮箱地址(需攻击者可控)。
  2. 检查响应
    • 如果页面返回:
      1
      1
      说明请求成功,系统已向 admin@qq.com 发送了密码重置邮件 。

5. 完成密码重置

  1. 访问忘记密码页面
    • 打开:http://192.168.56.104/index.php?m=member&c=index&a=public_forget_password&siteid=1
    • 输入目标邮箱:admin@qq.com
    • 输入验证码(若有)。
    • 提交请求。
  2. 查收邮件
    • 登录 admin@qq.com 邮箱,查看重置邮件。
    • 邮件通常包含重置链接或验证码。
  3. 重置密码
    • 按照邮件指引,设置新密码(如 newpassword123)。

6. 登录管理员账户

  • 使用新密码登录管理员账户:
    • 用户名admin
    • 密码newpassword123
    • 地址http://192.168.56.104
  • 成功登录后,可完全控制系统后台 。

六、漏洞原理深入分析

1. 问题点

问题点 描述
Cookie 伪造 服务端信任 xxx_reguserid 字段,未验证用户是否已登录或字段合法性。
验证流程缺失 系统允许未认证用户通过伪造 Cookie 调用密码重置接口。
无关联校验 未验证 xxx_reguserid 是否与 newemail 绑定的用户 ID 一致。

2. 漏洞代码分析(假设)

Phpcms 的密码重置接口可能包含类似以下逻辑:

1
2
3
4
5
6
7
8
// 重置邮件发送接口
$reguserid = $_COOKIE['xxx_reguserid'];
$newemail = $_GET['newemail'];
if ($reguserid) {
send_reset_email($newemail); // 直接发送重置邮件
} else {
die("无权限");
}

问题

  • 未验证 xxx_reguserid 是否来自合法会话。
  • 未检查 $reguserid 是否与 $newemail 关联的用户匹配。

3. 危害

  • 无需认证:攻击者无需登录即可触发重置邮件。
  • 管理员接管:可重置管理员密码,获取系统最高权限。
  • 批量攻击:通过枚举用户 ID,批量重置多个账户密码。

七、防护建议

  1. 加强 Cookie 校验

    • 验证 xxx_reguserid 是否与当前会话用户匹配:
      1
      2
      3
      if (!isset($_SESSION['userid']) || $_SESSION['userid'] != base64_decode($_COOKIE['xxx_reguserid'])) {
      die("非法访问!");
      }
    • 确保 Cookie 不可随意伪造(如添加签名或加密)。
  2. 关联校验

    • 验证目标邮箱是否与请求用户绑定:
      1
      2
      3
      4
      $user = get_user_by_id(base64_decode($_COOKIE['xxx_reguserid']));
      if ($user['email'] != $_GET['newemail']) {
      die("邮箱不匹配!");
      }
  3. 强制登录验证

    • 要求用户登录后才能访问密码重置接口:
      1
      2
      3
      if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
      die("请先登录!");
      }
  4. 限制重置频率

    • 添加频率限制(如每小时限制发送邮件次数)。
    • 使用验证码或二次验证(如短信、邮箱验证码)。
  5. 部署 WAF

    • 配置 Web 应用防火墙,拦截异常的密码重置请求。
    • 检测可疑的 newemail 参数或频繁请求。
  6. 日志监控

    • 记录所有密码重置请求,监控异常行为。
    • 定期审计日志,发现潜在攻击。
  7. 升级系统

    • 升级到 Phpcms 最新版本,修复已知逻辑漏洞。
    • 定期检查系统补丁和安全更新。

八、总结

项目 信息
漏洞类型 认证绕过 / 越权密码重置(逻辑漏洞)
影响版本 Phpcms v9.6.0
靶场环境 Windows 7 + PhpStudy + Phpcms
利用方式 伪造 Cookie + 触发重置邮件
危害 重置任意用户密码、系统完全沦陷
修复核心 Cookie 校验、关联验证、登录限制

Phpcms v9.6.0 的逻辑漏洞展示了认证流程设计缺陷的严重后果。攻击者通过伪造 Cookie 中的 xxx_reguserid,可无门槛地重置任意用户密码,包括管理员账户,从而完全控制系统。开发者应在设计认证和密码重置功能时,严格校验用户身份、关联性和会话状态,结合频率限制和 WAF,构建多层次防御体系。

免责声明:本文内容仅供安全研究和防护参考,请勿用于非法攻击活动。


Phpcms v9.6.0 逻辑漏洞:越权重置任意用户密码
https://bae-ace.github.io/2025/08/03/Phpcms-v9-6-0-逻辑漏洞:越权重置任意用户密码/
作者
bae
发布于
2025年8月3日
许可协议