Revive Adserver中的IDOR漏洞:任意经理可删除他人广告横幅的技术分析

本文详细分析了Revive Adserver广告管理系统中存在的一个IDOR(不安全的直接对象引用)漏洞。该漏洞允许拥有“经理”权限的用户通过操纵请求参数,删除其他经理账户所属的广告横幅,从而实现横向权限提升,对广告活动的完整性和平台收入构成威胁。

IDOR漏洞导致广告横幅被任意删除

漏洞概述

在Revive Adserver的横幅删除端点 (/www/admin/banner-delete.php) 中发现了一个IDOR(不安全的直接对象引用)漏洞。此漏洞允许任意“经理”账户删除属于其他“经理”的广告横幅。攻击者可通过简单地操纵bannerid参数,同时保持自己有效的clientidcampaignid来利用此漏洞。

技术描述

该漏洞的根源在于代码逻辑缺陷。当用户请求删除横幅时,端点会验证用户是否对相关的客户广告活动拥有访问权限(检查发生在代码的第30-31行),但并未验证用户是否拥有其试图删除的特定横幅的所有权(第32行缺少检查)。随后,代码会循环遍历提供的横幅ID并将其删除,过程中完全没有进行所有权验证(第40-48行)。

通过对比类似的删除端点发现:campaign-delete.php文件在循环内部正确地验证了所有权,但banner-delete.php却没有。

复现步骤

前提条件:

  • 两个经理账户(经理A - 攻击者,经理B - 受害者)
  • 每个经理都有自己的客户、广告活动和横幅
  • 运行Revive Adserver 6.0.1

利用步骤:

  1. 登录攻击者账户:以经理A(攻击者)身份登录系统。
  2. 导航至横幅管理页面:访问攻击者自己的广告活动横幅页面(例如:http://localhost:8080/www/admin/campaign-banners.php?clientid=100&campaignid=100)。
  3. 提取CSRF令牌
    • 打开浏览器开发者工具 → 网络标签。
    • 查找任何操作链接(如“停用/删除”)。
    • 复制token参数的值(一个32位的十六进制字符串)。
  4. 识别受害者横幅ID:横幅ID是连续的整数,可通过枚举或其他方式获取。本例中,受害者横幅ID为2001
  5. 构造恶意删除URL
    1
    
    http://localhost:8080/www/admin/banner-delete.php?token=<你的令牌>&clientid=100&campaignid=100&bannerid=2001
    
    • token: 攻击者有效的CSRF令牌。
    • clientid=100: 攻击者的客户ID(通过授权检查)。
    • campaignid=100: 攻击者的广告活动ID(通过授权检查)。
    • bannerid=2001: 受害者的横幅ID(无检查!)。
  6. 执行攻击:在同一个会话中,将构造的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日:该漏洞报告被公开披露。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计