IDOR漏洞导致广告横幅被任意删除
漏洞概述
在Revive Adserver的横幅删除端点 (/www/admin/banner-delete.php) 中发现了一个IDOR(不安全的直接对象引用)漏洞。此漏洞允许任意“经理”账户删除属于其他“经理”的广告横幅。攻击者可通过简单地操纵bannerid参数,同时保持自己有效的clientid和campaignid来利用此漏洞。
技术描述
该漏洞的根源在于代码逻辑缺陷。当用户请求删除横幅时,端点会验证用户是否对相关的客户和广告活动拥有访问权限(检查发生在代码的第30-31行),但并未验证用户是否拥有其试图删除的特定横幅的所有权(第32行缺少检查)。随后,代码会循环遍历提供的横幅ID并将其删除,过程中完全没有进行所有权验证(第40-48行)。
通过对比类似的删除端点发现:campaign-delete.php文件在循环内部正确地验证了所有权,但banner-delete.php却没有。
复现步骤
前提条件:
- 两个经理账户(经理A - 攻击者,经理B - 受害者)
- 每个经理都有自己的客户、广告活动和横幅
- 运行Revive Adserver 6.0.1
利用步骤:
- 登录攻击者账户:以经理A(攻击者)身份登录系统。
- 导航至横幅管理页面:访问攻击者自己的广告活动横幅页面(例如:
http://localhost:8080/www/admin/campaign-banners.php?clientid=100&campaignid=100)。 - 提取CSRF令牌:
- 打开浏览器开发者工具 → 网络标签。
- 查找任何操作链接(如“停用/删除”)。
- 复制
token参数的值(一个32位的十六进制字符串)。
- 识别受害者横幅ID:横幅ID是连续的整数,可通过枚举或其他方式获取。本例中,受害者横幅ID为
2001。 - 构造恶意删除URL:
1http://localhost:8080/www/admin/banner-delete.php?token=<你的令牌>&clientid=100&campaignid=100&bannerid=2001token: 攻击者有效的CSRF令牌。clientid=100: 攻击者的客户ID(通过授权检查)。campaignid=100: 攻击者的广告活动ID(通过授权检查)。bannerid=2001: 受害者的横幅ID(无检查!)。
- 执行攻击:在同一个会话中,将构造的URL粘贴到浏览器地址栏并访问。系统将重定向并显示“横幅已被删除”的确认信息。
影响与攻击特征
影响:
- 广告活动破坏:攻击者可删除竞争对手的横幅,扰乱其广告活动。
- 收入损失:受害者会失去活跃广告,导致潜在收入受损。
- 声誉损害:受影响的客户可能对平台失去信任。
- 数据完整性破坏:未经授权的删除绕过了审计控制。
攻击特征:
- 所需权限低:仅需“经理”账户(非管理员)。
- 易于利用:简单的参数操纵,无需特殊工具。
- 隐蔽性强:在日志中看起来像合法删除。
- 可规模化:可自动化删除多个横幅。
- 跨上下文攻击:A机构的经理可以攻击B机构的经理。
时间线与修复
- 2025年10月27日:漏洞由安全研究员
cyberjoker(Vitaly Simonovich)报告给Revive Adserver团队。 - 2025年10月28日:项目维护者
mbeccati提供了修复代码,并将报告状态标记为“已解决”。 - 2025年11月4日:为该漏洞分配了CVE编号:CVE-2025-52670。
- 2025年11月5日:Revive Adserver计划发布包含此修复的安全版本。出于风险考虑,披露细节会延迟,以给用户足够的升级时间。
- 2025年11月19日:该漏洞报告被公开披露。