
存储型XSS是一种恶意脚本存储在服务器上,之后其他用户打开相应页面时自动执行的漏洞,属于CWE-79(网页生成过程中输入未正确中和('跨站脚本'))指定的攻击类型。
WordPress是全球最受欢迎的开源内容管理系统(CMS),使用户能够轻松构建和管理网站及博客。即使用户没有代码知识,也可以通过各种插件和主题扩展和定制网站。
WP Activity Log是一个用于跟踪和记录WordPress网站管理活动的插件。它有助于管理员实时监控网站上发生的各种事件,并为安全审计或问题解决提供日志。
CVE-2025-0924存在于WP Activity Log插件(5.2.2及以下版本)中,由于对'message'参数缺乏输入验证和输出转义而触发。本文将分析该漏洞是如何发生的,并探讨相应的应对措施。
在WordPress中,当用户将恶意脚本复制粘贴到网站标题中,并且该更改通过WP Activity Log 5.2.2记录时,就会发生存储型XSS攻击。下面通过示例了解如何利用WP Activity Log触发存储型XSS。
[图1] WordPress文章编写,数据库脚本插入
从[图1]可以看到,首先为了生成日志而创建文章。在此过程中编写两篇文章,一篇直接打字输入,另一篇通过复制粘贴方式输入。创建文章后查看数据库,发现复制粘贴的文章中,post_title字段的值未经适当的sanitize(清理和过滤输入值) 即被存储。
这说明根据输入方式不同,数据可能被不同处理,这可能导致XSS(跨站脚本)漏洞的产生。
[图2] WP Activity Log日志生成及攻击检查
[图1]中创建的文章记录留存在WP Activity Log的日志中,当从数据库获取信息并请求"More details..."时,可以确认[图2]中的脚本被执行。
[图3] class-list-events.php - More details... 返回
如[图3]所示,"More details..."通过AjaxInspector(ajax回调函数 / get metadata)、occurrence接收并输出结果。
[图4] AuditLog.php -> AjaxInspector() - 未进行sanitize
[图4] metadata示例
[图3]中看到的[图4] AjaxInspector在通过[图5] metadata生成结果时,未对变量进行sanitize而直接返回,从而导致漏洞发生。至此,我们通过WordPress安全日志插件WP Activity Log了解了存储型XSS。这种情况只要能够在用户页面创建和日志中上传脚本内容就会发生,因此作为应对措施,建议将WP Activity Log从5.2.2版本更新至5.3.0或更高版本。
[图5] AjaxInspector变更内容 / 添加esc_html()
在该案例中,问题似乎是在返回HTML结果时未使用esc_html()进行适当sanitize所致。但对于此分析是否与CVE-2025-0924所描述的漏洞完全一致,目前尚未确定。
目前已升级至5.3.0版本并进行测试,确认已采取措施解决了问题。但CVE-2025-0924描述的漏洞是通过##message##参数进行的存储型跨站脚本,并指明了路径为class-alert.php、class-alert-manager.php。
然而,根据我的分析,问题并非出在message参数,而是metadata,且过程中存在问题的PHP路径是class-list-events.php和AuditLog.php,因此除了“存储型跨站脚本”外,其余部分与NIST的描述均不相同。所以,是否完全一致还需进一步确认。