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 中的
- 难度:中等(需了解 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. 部署步骤
- 安装 PhpStudy:
- 在 Windows 7 虚拟机中安装 PhpStudy,配置 PHP 和 MySQL 环境。
- 确保 Web 服务监听在
192.168.56.104:80。
- 部署 Phpcms v9.6.0:
- 下载 Phpcms v9.6.0,解压到 PhpStudy 的
WWW目录。 - 访问
http://192.168.56.104完成安装,配置数据库连接。
- 下载 Phpcms v9.6.0,解压到 PhpStudy 的
- 注册测试用户:
- 创建一个以 “1” 开头的用户,例如:
- 用户名:
1abc - 密码:任意(如
123456) - 邮箱:
attacker@qq.com(攻击者控制的邮箱)
- 用户名:
- 确保目标系统存在管理员账户(如
admin,邮箱为admin@qq.com)。
- 创建一个以 “1” 开头的用户,例如:
四、漏洞原理剖析
1. 漏洞本质
Phpcms v9.6.0 的密码重置功能存在以下逻辑缺陷:
- Cookie 伪造:服务端根据 Cookie 中的
xxx_reguserid字段判断用户身份,但未验证用户是否已登录或该字段是否合法。 - 验证流程缺失:攻击者可伪造
xxx_reguserid(如设置为1,对应管理员用户 ID),向任意邮箱发送重置密码邮件。 - 无关联校验:系统未验证
xxx_reguserid是否与目标邮箱地址绑定,导致攻击者可为任意用户(如admin)发起密码重置。
2. 利用链
1 | |
3. 危害
- 无需认证:攻击者无需登录即可触发密码重置。
- 任意用户控制:可重置管理员或其他用户密码,获取完整系统权限。
- 批量攻击:通过遍历用户 ID,批量发送重置邮件,控制多个账户。
五、漏洞利用流程
1. 准备阶段
- 邮箱准备:
- 攻击者邮箱:
attacker@qq.com(用于注册测试用户) - 目标邮箱:
admin@qq.com(管理员账户绑定的邮箱,需可控)
- 攻击者邮箱:
- 注册测试用户:
- 用户名:
1abc - 密码:任意(如
123456) - 邮箱:
attacker@qq.com
- 用户名:
- 工具:
- Burp Suite(抓取 Cookie)
- Firefox(登录测试用户)
- Google Chrome(伪造 Cookie)
- 邮箱客户端(接收重置邮件)
2. 登录测试用户并获取 Cookie
- 登录 1abc 账户:
- 使用 Firefox 访问
http://192.168.56.104,登录用户1abc。
- 使用 Firefox 访问
- 抓取 Cookie:
- 打开 Burp Suite,配置代理(默认:
127.0.0.1:8080)。 - 访问任意页面(如首页),在 Burp 中拦截请求。
- 找到 Cookie 中的
xxx_username字段,例如:
- 打开 Burp Suite,配置代理(默认:
1 | |
- 说明:
MWFiYw==是用户名1abc的 Base64 编码值。
- 复制 Cookie:
- 记录
xxx_username=MWFiYw==,用于后续伪造。
- 记录
3. 伪造 Cookie(控制台操作)
- 打开 Chrome:
- 使用 Google Chrome(无需登录任何账户)。
- 访问靶站首页:
http://192.168.56.104。
- 伪造 Cookie:
- 按
F12打开开发者工具,切换到 Console 面板。 - 输入以下命令:
1
document.cookie="xxx_reguserid=MWFiYw=="; - 目的:通过伪造
xxx_reguserid,让系统误认为当前请求来自用户1abc。
- 按
- 验证 Cookie:
- 在 Console 中输入
document.cookie,确认 Cookie 已设置:1
xxx_reguserid=MWFiYw==
- 在 Console 中输入
4. 触发密码重置邮件
- 访问重置邮件接口:
- 在 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:目标账户的邮箱地址(需攻击者可控)。
- 在 Chrome 中访问以下 URL,指定管理员邮箱:
- 检查响应:
- 如果页面返回:说明请求成功,系统已向
1
1admin@qq.com发送了密码重置邮件 。
- 如果页面返回:
5. 完成密码重置
- 访问忘记密码页面:
- 打开:
http://192.168.56.104/index.php?m=member&c=index&a=public_forget_password&siteid=1 - 输入目标邮箱:
admin@qq.com - 输入验证码(若有)。
- 提交请求。
- 打开:
- 查收邮件:
- 登录
admin@qq.com邮箱,查看重置邮件。 - 邮件通常包含重置链接或验证码。
- 登录
- 重置密码:
- 按照邮件指引,设置新密码(如
newpassword123)。
- 按照邮件指引,设置新密码(如
6. 登录管理员账户
- 使用新密码登录管理员账户:
- 用户名:
admin - 密码:
newpassword123 - 地址:
http://192.168.56.104
- 用户名:
- 成功登录后,可完全控制系统后台 。
六、漏洞原理深入分析
1. 问题点
| 问题点 | 描述 |
|---|---|
| Cookie 伪造 | 服务端信任 xxx_reguserid 字段,未验证用户是否已登录或字段合法性。 |
| 验证流程缺失 | 系统允许未认证用户通过伪造 Cookie 调用密码重置接口。 |
| 无关联校验 | 未验证 xxx_reguserid 是否与 newemail 绑定的用户 ID 一致。 |
2. 漏洞代码分析(假设)
Phpcms 的密码重置接口可能包含类似以下逻辑:
1 | |
问题:
- 未验证
xxx_reguserid是否来自合法会话。 - 未检查
$reguserid是否与$newemail关联的用户匹配。
3. 危害
- 无需认证:攻击者无需登录即可触发重置邮件。
- 管理员接管:可重置管理员密码,获取系统最高权限。
- 批量攻击:通过枚举用户 ID,批量重置多个账户密码。
七、防护建议
加强 Cookie 校验
- 验证
xxx_reguserid是否与当前会话用户匹配:1
2
3if (!isset($_SESSION['userid']) || $_SESSION['userid'] != base64_decode($_COOKIE['xxx_reguserid'])) {
die("非法访问!");
} - 确保 Cookie 不可随意伪造(如添加签名或加密)。
- 验证
关联校验
- 验证目标邮箱是否与请求用户绑定:
1
2
3
4$user = get_user_by_id(base64_decode($_COOKIE['xxx_reguserid']));
if ($user['email'] != $_GET['newemail']) {
die("邮箱不匹配!");
}
- 验证目标邮箱是否与请求用户绑定:
强制登录验证
- 要求用户登录后才能访问密码重置接口:
1
2
3if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
die("请先登录!");
}
- 要求用户登录后才能访问密码重置接口:
限制重置频率
- 添加频率限制(如每小时限制发送邮件次数)。
- 使用验证码或二次验证(如短信、邮箱验证码)。
部署 WAF
- 配置 Web 应用防火墙,拦截异常的密码重置请求。
- 检测可疑的
newemail参数或频繁请求。
日志监控
- 记录所有密码重置请求,监控异常行为。
- 定期审计日志,发现潜在攻击。
升级系统
- 升级到 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-逻辑漏洞:越权重置任意用户密码/