利用追踪器名称在转化统计中实现存储型XSS漏洞深度解析

本文详细分析了在Revive Adserver的转化统计页面中,攻击者如何通过追踪器名称注入恶意脚本,在管理员查看报告时触发XSS,实现从低权限广告商到高权限管理员的权限提升,并探讨了HttpOnly Cookie下的攻击场景。

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

报告者: cyberjoker 提交时间: 2025年10月26日 19:51 UTC

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


受影响系统

  • 产品: Revive Adserver
  • 测试版本: 6.0.1
  • 组件: 统计 / 转化报告
  • 文件: www/admin/stats-conversions.php:356
  • URL: http://[host]/www/admin/stats-conversions.php?clientid=[id]

漏洞代码

1
2
3
4
// 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标签的输入验证
  • 管理员在查看转化报告时,会在其浏览器上下文中执行有效载荷

我如何复现它

前提条件:

  • 广告商账户(低权限)
  • 管理员账户(用于测试影响)

步骤:

  1. 以广告商身份登录并创建恶意追踪器:

    • 导航至:Inventory → Advertisers → 点击您的广告商名称(例如 “Test Advertiser”)→ Trackers 标签页
    • 点击 Add new tracker
    • 设置追踪器名称为:
      1
      
      <img src=x onerror="alert('XSS: ' + document.cookie)">
      
    • 设置追踪器类型为 “Sale”,状态为 “Active”
    • 点击 Save Changes
    • 追踪器现已保存(追踪器ID 1)
  2. 创建转化记录(通过正常追踪或数据库):

    1
    2
    3
    4
    5
    
    -- 将转化关联到恶意追踪器
    INSERT INTO rv_data_intermediate_ad_connection (
        tracker_id, ad_id, inside_window, tracker_date_time,
        connection_date_time, connection_action, connection_status, updated
    ) VALUES (1, 1, 1, NOW(), NOW(), 1, 4, NOW());
    
  3. 以管理员身份登录并导航至:

    1
    
    http://[host]/www/admin/stats-conversions.php?clientid=1
    

    注意:在默认/全新安装中,此页面可能无法通过菜单访问。详见下文“菜单配置说明”部分。

  4. 结果: JavaScript alert 立即触发:

    1
    
    XSS: sessionID=abc123; ox_install_session_id=def456
    

我确认XSS在管理员的浏览器上下文中执行,并具有完整的Cookie访问权限。该有效载荷具有持久性——每次任何管理员查看该广告商的转化统计信息时都会触发。

备注

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

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

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

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

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

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

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

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

影响

广告商(或被入侵的广告商账户)可以注入持久性XSS,当管理员查看转化统计时执行。我成功地捕获了管理员的会话Cookie,这可以实现完整的账户接管。攻击者随后可以创建管理员账户、修改广告活动、访问所有广告商数据,或注入影响所有用户的代码。这之所以可行,是因为广告商定期创建追踪器,而管理员定期审阅转化统计——不需要任何异常行为。


时间线记录

  • 2025年10月26日 19:51 UTC: cyberjoker 提交报告给 Revive Adserver。
  • 2025年10月27日 08:39 UTC: mbeccati (Revive Adserver 工作人员) 将状态更改为 Triaged
    • 工作人员指出报告存在一些错误,但总体上漏洞确实存在。例如:插入查询无效、无需修改配置、实际URL路径应为stats.php?entity=conversions&clientid=1、会话ID Cookie是HttpOnly(无法通过JS读取)、需要实际转化数据。
  • 2025年10月27日 08:42 UTC: mbeccati 将严重性从 高 (8.7) 更新为 低 (2.6)
  • 2025年10月27日 09:28 UTC: cyberjoker 发布评论,详细反驳严重性降级。
    • 承认自己在SQL INSERT、URL路径、配置变更方面的错误。
    • 详细解释了即使存在HttpOnly Cookie,攻击者仍可通过XSS进行“会话劫持”(Session Riding),利用管理员浏览器上下文和页面中的CSRF令牌执行特权操作(如创建管理员账户、修改广告活动)。
    • 演示了攻击者可以通过curl手动制造转化数据,降低了攻击复杂度。
    • 提出了自己的CVSS评分(8.7,高危)并进行了详细论证。
  • 2025年10月27日 10:53 UTC: mbeccati 将严重性从 低 (2.6) 更新为 高 (7.3),接受了关于CVSS大部分指标的修改,但范围(Scope) 仍视为未改变(仅在应用内)。
  • 2025年10月27日 14:28 UTC: cyberjoker 进一步评论,认为当漏洞影响能跨越不同权限域(如广告商到管理员)时,CVSS的范围(Scope) 应视为已改变。
  • 2025年10月28日 10:59 UTC: mbeccati 将严重性从 高 (7.3) 更新为 高 (8.7),接受了关于范围的建议。
  • 2025年10月28日 11:12 UTC: mbeccati 发布修复漏洞的补丁 (h1-3400506.patch)。
  • 2025年10月28日 11:12 UTC: mbeccati 将报告状态更改为 Resolved,并计划于11月5日(周三)发布安全更新,并请求CVE-ID。
  • 2025年10月28日 13:34 UTC: cyberjoker 确认补丁,提供署名名称 “Vitaly Simonovich”,并同意延迟披露细节。
  • 2025年11月04日 17:08 UTC: mbeccati 更新CVE参考为 CVE-2025-52668
  • 2025年11月09日 21:27 UTC: cyberjoker 询问CVE何时出现在cve.org网站。
  • 2025年11月10日 07:58 UTC: erikgeurts (Revive Adserver 工作人员) 回复,表示CVE流程不由他们控制,会延迟公开披露以留出用户升级时间。
  • 大约7天前: mbeccati 请求披露此报告。
  • 大约7天前: mbeccati 披露了此报告。
  • 最终状态: 报告已解决,严重性为 高 (8.7),已于 2025年11月19日 09:33 UTC 披露。
  • 弱点类型: 存储型跨站脚本 (XSS)
  • CVE ID: CVE-2025-52668
  • 赏金: 无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计