报告 #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]
漏洞代码
|
|
问题所在:
- 追踪器名称被直接输出,没有经过
htmlspecialchars()转义 - 数据来自广告商控制的输入(追踪器创建表单)
- 在存储时没有进行去除HTML标签的输入验证
- 管理员在查看转化报告时,会在其浏览器上下文中执行有效载荷
我如何复现它
前提条件:
- 广告商账户(低权限)
- 管理员账户(用于测试影响)
步骤:
-
以广告商身份登录并创建恶意追踪器:
- 导航至:Inventory → Advertisers → 点击您的广告商名称(例如 “Test Advertiser”)→ Trackers 标签页
- 点击 Add new tracker
- 设置追踪器名称为:
1<img src=x onerror="alert('XSS: ' + document.cookie)"> - 设置追踪器类型为 “Sale”,状态为 “Active”
- 点击 Save Changes
- 追踪器现已保存(追踪器ID 1)
-
创建转化记录(通过正常追踪或数据库):
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()); -
以管理员身份登录并导航至:
1http://[host]/www/admin/stats-conversions.php?clientid=1注意:在默认/全新安装中,此页面可能无法通过菜单访问。详见下文“菜单配置说明”部分。
-
结果: JavaScript alert 立即触发:
1XSS: sessionID=abc123; ox_install_session_id=def456
我确认XSS在管理员的浏览器上下文中执行,并具有完整的Cookie访问权限。该有效载荷具有持久性——每次任何管理员查看该广告商的转化统计信息时都会触发。
备注
其他发现: 在调查此问题时,我注意到:
- 第357-358行同样缺少对
campaignid和campaignname的htmlspecialchars()转义 - 广告活动名称同样由用户(广告商)控制,存在相同的漏洞
- 其他
stats-*.php文件可能存在类似问题——我尚未全部审核
测试范围: 我在独立的Docker环境中测试了此漏洞,使用的账户是我自己创建的。我没有:
- 针对生产环境/公共的Revive Adserver安装进行测试
- 尝试超出受控PoC的实际利用
- 窃取或访问任何真实的用户数据
菜单配置说明:
重要:在新的Revive Adserver安装中,stats-conversions.php页面不包含在默认菜单系统中。在测试期间,我不得不通过修改lib/OA/Admin/Menu/config.php来添加菜单条目以手动启用它:
|
|
这很可能是一个配置问题,而非安全控制,因为:
- 代码级别的权限检查(
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读取)、需要实际转化数据。
- 工作人员指出报告存在一些错误,但总体上漏洞确实存在。例如:插入查询无效、无需修改配置、实际URL路径应为
- 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
- 赏金: 无