Revive Adserver存储型XSS漏洞:通过跟踪器名称劫持管理员会话

19 阅读4分钟

Revive Adserver | 报告 #3400506 - 通过跟踪器名称在转化统计中实现存储型XSS

漏洞概述

我在转化统计页面发现了一个存储型跨站脚本(XSS)漏洞。广告商可以通过跟踪器名称注入恶意JavaScript,当管理员查看转化报告时(www/admin/stats-conversions.php:356),该脚本会执行。我利用此漏洞成功窃取了管理员会话cookie。这是一个权限提升问题:低权限的广告商账户可以危害高权限的管理员账户。

漏洞代码

// www/admin/stats-conversions.php:356
echo "<td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>{$conversion['trackername']}</td>
      <td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>{$conversion['campaignid']}</td>
      <td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>{$conversion['campaignname']}</td>";

问题所在:

  • 跟踪器名称在输出时未使用 htmlspecialchars() 进行转义
  • 数据来自广告商可控的输入(跟踪器创建表单)
  • 存储时没有输入验证来剥离HTML标签
  • 查看转化报告的管理员将在其浏览器上下文中执行有效负载

注释

其他发现: 在调查此问题时,我注意到:

  • 第357-358行同样缺少对 campaignidcampaignnamehtmlspecialchars() 转义
  • 广告活动名称同样由用户(广告商)控制,并存在相同的漏洞
  • 其他 stats-*.php 文件可能存在类似问题——我尚未全部审计

测试范围: 我在一个隔离的Docker环境中测试了此漏洞,使用的是我自己创建的账户。我没有:

  • 针对生产环境/公开的Revive Adserver安装进行测试
  • 尝试超出受控PoC范围的实际利用
  • 窃取或访问任何真实用户数据

菜单配置说明: 重要提示:在全新的Revive Adserver安装中,stats-conversions.php 页面并未包含在默认菜单系统中。在测试期间,我不得不通过修改 lib/OA/Admin/Menu/config.php 来添加菜单项以启用它:

$oMenu->addTo("2.1", new OA_Admin_Menu_Section("stats-conversions",
 'Conversions', "stats-conversions.php?clientid={clientid}",
 false, "statistics/conversions"));

这很可能是一个配置问题,而非安全控制措施,因为:

  • 代码层面的权限检查 (OA_Permission::enforceAccount) 允许广告商/经理访问
  • 其他包含类似数据的统计页面是可访问的
  • 无论菜单是否可见,易受攻击的代码都存在

后续讨论与修复

项目维护者回复 (2025-10-27): 感谢详细的报告。有几个错误,但总体来说漏洞是存在的。

  • 建议的SQL查询无效,因为有更多不可为空的列没有默认值。
  • 无需更改 config.php,否则该漏洞将不可接受。
  • 可利用的URL例如是 stats.php?entity=conversions&clientid=1
  • 会话ID cookie 是 HttpOnly 的,因此无法通过JS读取:无法窃取会话!
  • XSS 需要实际的转化记录,鉴于第三方cookie的各种限制,这相当罕见。
  • 相应地更新了风险因素:
    • 复杂性:高,因为数据库需要有转化记录,这不在攻击者控制范围内
    • 范围:未改变,因为攻击者无法访问其他系统
    • 机密性:低 - 无法窃取会话ID
    • 完整性:无 - 为什么会有影响?
    • 将CVSS严重性从高(8.7)更新为低(2.6)。

报告者进一步反驳 (2025-10-27): 针对HttpOnly问题,报告者指出,虽然无法直接窃取cookie(document.cookie),但攻击依然有效:

  • 没有CSP或X-Frame-Options头,XSS载荷可以无阻碍执行。
  • 会话挟持(Session Riding) 依然可行:XSS在管理员浏览器中运行时,JavaScript可以读取页面DOM中的CSRF令牌,并使用 fetch() 配合 credentials: 'include' 发起请求,浏览器会自动发送HttpOnly cookie,从而实现以管理员权限执行操作(如创建管理员账户、修改广告活动)。
  • 关于转化记录的复杂性:攻击者可以自行制造转化,无需依赖第三方cookie或真实广告展示,只需通过curl访问两个URL即可。
  • 建议的CVSS评分应更高:CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N 得分为8.7(高),最低也应达到6.0(中)。

维护者更新 (2025-10-27 至 2025-10-28):

  • 接受了CVSS的更改,但范围仍维持不变(仅在应用内部)。
  • 最终将严重性从高(7.3)更新至高(8.7),接受了报告者的建议(认为攻击跨越了权限边界,范围应视为改变)。
  • 提供了补丁文件 h1-3400506.patch 以修复漏洞。
  • 报告状态更新为“已解决”。
  • 计划于2025年11月5日发布安全版本,修复多个漏洞,并将申请CVE-ID。
  • CVE ID 被分配为 CVE-2025-52668
  • 报告于2025年11月19日公开披露。 biOK/hzhVF2yKaGc5mK8oXIEkdw1U0SUEAjO/010PZrIRSOwsFIO6Vk9hdFJImvu