DOM 净化 - 不受信任的节点绕过

这篇文章是为在合同范围内进行测试的安全专家准备的,作者不对因应用所提供信息而造成的任何损害负责,恶意程序的分发、系统操作的干扰以及通信机密性的侵犯是违法的。

引言部分:作者旨在阐明最近发现的 DOMPurify 实现中的一个缺陷,虽可能与该库的最常见用例无关,但仍值得探索。

净化字符串节点:通常使用库时会将字符串传递给 sanitize 函数,也有将 HTML 节点作为参数传递的情况,作者近期就遇到了这种用法,并给出了相关代码示例。

无法获取 XSS……:解析过程本身无差异,若要绕过 DOMPurify 的过滤需找到通用方法,目前仅传递节点本身无法绕过。

混淆……:思考后发现 HTML 和 XML 上下文之间的混淆可用于实现 XSS,通过上传简单 SVG 文件并插入链接进行测试,发现可将 XML 节点插入 HTML 中。

然后呢?:XML 中有处理指令(Processing Instructions)而 HTML 中没有,测试 DOMPurify 对处理指令的处理,发现未被移除,通过特定文件上传和代码测试,可触发弹窗警报。

第一个修复:作者向项目维护者报告后,维护者几乎立即推送了修复,使 NodeFilter 也检查处理指令,现在它们会被移除,但在用户扩展标准配置时问题仍存在。

自定义配置:在特定自定义配置下,如允许任何以 -foo-bar 结尾的自定义标签,问题仍会出现,因为 XML 和 HTML 对标签名的要求不同。

第二个修复:第二天引入了针对此问题的修复,涉及用特殊正则表达式检查自定义元素名称。

结论:作者感谢 cure53 的 mario 快速解决问题,希望读者喜欢文章并了解 HTML 和 XML 的一些差异。

阅读 65
0 条评论