Lexs:绕过词汇解析安全控制

2021-06-26 01:12:54

TL; DR通过使用利用HTML解析逻辑的特殊HTML标签,即使在词汇解析器用于无效危险内容的情况下,也可以实现跨站点脚本(XSS)。利用这些类型的XSS漏洞的主要目标是让Sunitize Lexical解析器将数据视为文本数据而不是计算机指令(例如,JavaScript指令)。当HTML解析器和消毒词法解析不以相同的方式解析数据时,这种类型的攻击是可能的。

注意:此博客文章假定以前的XSS知识(更好地描述为JavaScript注入)以及对HTML的基本了解。对于一个高级底漆,请将返回到我们的XSS概述写作。

XSS保护有多种形式。在预防XS的早期和偶尔今天,正则表达式(REGEX)用于检查&#34的用户输入;危险"字符串。一个简化的例子是,如果用户提供了包含< script&gt的输入。 ,Regex会匹配细则字符串并将其删除。但是,这种基于REGEX的XSS保护通常会错过标记,因为有很多方法可以制定JavaScript串以绕过保护。在相同的简化示例中,简单简单地将< script&gt中的字母大写字母。会绕过过滤器并导致XSS。因此,不建议尝试正则表达式过滤器以防止XSS。

所以,让'谈论更好的解决方案。上下文输出编码是XSS保护的一种形式,可以将特殊字符(如&#34)转换为" < 34;和#34; >"进入无害的HTML编码输出(例如,"&"和#34;& gt;")。这种形式的保护将用户'源中的输入放置在源中的输入,以确保可能导致JavaScript执行或HTML呈现的任何JavaScript或HTML可用字符转移到非危险的HTML实体编码表单中。这是处理应用程序中呈现的用户输入的好方法;实际上,许多当代前端框架现在将默认执行输出编码(例如,反应js和角度)。但是,这种保护形式可以限制应用程序允许用户包含某些类型的HTML的丰富文本的能力。

如果用户需要能够在图像,链接和丰富的文本等HTML中包含一些HTML,那么怎么样?这是词汇解析发挥作用的地方。

词汇解析是一种非常复杂的防止XS的方式,因为它在执行诸如阻塞或编码数据的附加逻辑之前,评估数据是否是指令或明文。在高级,可以将词汇解析描述为解析,其将从计算机指令(即,JavaScript和某些危险的HTML标记)分离用户数据(即非危险文本内容)。在用户允许用户通过设计允许HTML子集的情况下,这种类型的解析可用于确定允许内容以及将被阻止或消毒的内容。

允许设计的HTML子集的一些示例是Rich-Text编辑器,电子邮件客户端,您认为的内容(WysiWyg)与Tinymce或Froala等HTML编辑器,以及Dompurify等消毒库。在这些例子中,这种形式的词汇解析保护是常见的。

但是,当HTML解析器和消毒词汇解析器不以完全相同的方式处理数据时,可以利用作为XSS保护形式的词汇解析。此博客文章侧重于某些情况下如何通过利用HTML解析逻辑来引入JavaScript来欺骗词汇解析器,尽管存在复杂的保护。为了了解如何利用这些XSS问题,我们必须首先检查如何解析HTML;在处理数据期间警告和特殊情况;以及消毒解释者如何工作。

要了解我们如何在应用程序中使用词汇分析的应用程序中实现XSS,我们首先必须查看HTML如何解析,以及如何确定内容是数据或指令。下图是HTML解析器的可视化'操作顺序:

网络 - 该阶段是指将输入作为字节传输到解析器。

销售器 - 令牌化是词汇解析发生的地方。解析器将从计算机指令分开文本数据。为此,销记子将根据IT遇到的元素切换数据状态之间的上下文并将值返回为令牌。这在上下文状态部分中更详细地介绍。

树施工 - 从牌状阶段返回的令牌放在树结构中;每个树枝都称为节点。对于练习中的那种看起来更清楚的图片,让&#39检查以下HTML片段:下图显示了文档对象模型(DOM)树结构中的内容:我们作为攻击者的目标是控制HTML解析的此阶段中的节点。当我的导师Joe Demesy一旦描述了我,如果你可以控制节点' s的上下文和内容,你将有xss。

脚本执行 - 此阶段是指JavaScript发生了DOM。有关此阶段的其他详细信息不属于此博客文章的范围。

DOM - 构建文档对象模型的处理的结束状态。

关键外卖:现在您应该对数据如何流过HTML解析过程以及如何组织信息,这将有一个高级别的理解,并且如何在剥削期间发挥作用。

在令叫化阶段,HTML解析器将将HTML元素对称为上下文状态的不同类别。 HTML规范列出了上下文状态切换元素,如下所示:

设置如下所示的HTML解析器和#39; s令牌化阶段的状态,在上下文元素上切换:Title TextArea将令牌程序切换到RCData状态。 STYLE XMP IFRAME Noembed NoframeS将令牌程序切换到RawText状态。脚本将令牌程序切换到脚本数据状态。 NOScript如果启用了脚本标志,将令牌程序切换到RawText状态。否则,请将令牌程序留在数据状态。明文将令牌牌器切换到明文状态。任何其他元素都会在数据状态下留下令牌化器。

下面的可视化显示了其中一些上下文状态在实践中看起来像:RCData示例:

请注意,数据状态是尝试加载图像的唯一状态。这是因为数据是计算机指令,而不是简单的文本数据。

关键外带:不同提供的元素通过切换数据的上下文状态来改变这些元素中的数据如何解析和呈现。

浏览器的HTML解析器不仅仅是HTML;它可以在三个不同的名称空间之间切换:HTML,MATHML和SVG。

在HTML解析期间,如果是< svg>或< math>遇到命名空间元素(标记),解析器将切换上下文到相应的命名空间。该上下文切换到我们的意思是解析器不再被解析为HTML但是Mathml或SVG。

当HTML嵌入Mathml / SVG中时,此命名空间上下文切换会导致意外行为,因为每个命名空间都有自己的不同元素,并略有不同。作为渗透测试仪,我们可以在某些情况下利用此逻辑将解析器混为允许XSS。

MichałBentkowski' S Dompurify Bypass Workup提供了更深入的名称空间混乱,包括尖端研究和一个很好的例子。

关键外带:HTML解析器将在遇到MATHML或SVG元素时,将切换到单独的命名空间,该元素可用于混淆解析器。

为了利用消毒词汇解析器,我们需要了解他们如何工作的一般流程。在高水平,一般流程如下:

剥削的目标是提供HTML,它将欺骗消毒解析器,相信提供的输入是实际上计算机指令(数据状态)的非危险文本数据(RCData,明文或Rawtext)。这通常是可能的几种原因:HTML不是设计的两次;在初始HTML解析器和消毒解析器之间会发生解析的略有变化;消毒解析器经常实施自己的处理逻辑。

Tinymce是一个你是一个你看到的 - 什么 - 你得到(wysiwyg)html文本编辑器和javascript库。它通常包含在第三方网站中,以提供文本编辑功能,包括HTML文本。

由George Stekee和I发现的CVE-2020-12648(Tinymce中的XSS)将作为如何利用HTML解析警告在使用消毒解析器的情况下利用HTML解析警告的测试用例。在TinyMCE咨询中,XSS是通过以下有效载荷实现的:

由于令牌化和树施工阶段,此有效载荷成功。特别是,当LEXICAL解析器归库HTML时,在分配上下文状态之前,它不会正确地占元素的顺序。

< iframe>元素导致上下文状态切换到RawText,这意味着Iframe后面的数据被认为是不危险的,并且不需要消毒。该上下文切换结束于截止标签的< / iframe>但是,< textarea>元素还指示解析器切换到RCData上下文,另一种形式的非危险文本数据。当HTML解析器处理时,上下文切换到IFrame元素中包含在IFrame元素中。这种遏制是TinyMCE解析器未能实现的内容。

解析此内容时,TinyMCE解析器无法考虑操作顺序和上下文切换。因此,由最终消毒后的DOM树建设HTML解析器看起来像这样:

请注意,具有活动内容OnError事件的IMG元素在DOM树中的文本上下文中;在词汇解析时,这将注册为非危险而不是被剥离或输出编码。由于TextArea元素包含在IF帧中,因此IMG元素实际上并不在TextArea元素中。因此,执行了执行的活动内容(JavaScript)和XSS。

Froala是一个你的evis-is-get(wysiwyg)html文本编辑器和javascript库,它与tinymce相似。对于第二个测试用例,我们将审核作为本研究的一部分(CVE-2021-28114)找到的XSS漏洞。在此CVE的咨询中,我详细说明了如何使用以下有效载荷实现XSS:

此有效载荷与用一个警告的测试用例1中讨论的TinyMCE XS在功能相同。进入MathML命名空间以导致解析混淆(在Froala' s实例中,限制iframe元素中的注释)不足以混淆Froala Parser。但是,Froala' SARSER不了解MATHML命名空间标签,并删除标签,但继续解析剩余内容。结果是HTML解析器创建具有限制为文本数据的有效载荷的节点,如下图所示:

但是,由于Froala' S解析器省略了< math>元素,它仍将错误地将IMG元素有效载载视为非危险的评论。当最后阶段HTML解析器处理JavaScript有效载荷并将其放入DOM中时,它会如下所示:

结果是XSS有效载荷执行。这可以通过检查挖掘后源代码来进一步可视化:

Froala解析器移除了< math>元素并添加了 - >关闭它认为是一个评论。最后阶段HTML解析器查看了IFrame元素中包含的开放注释,并将Froala Parser添加到RCData状态的Closing Regure Comment元素,以忽略其作为有效的截止标记。结果是活动内容执行(XS)。

在实现允许某些用户控制的HTML的应用程序时,避免这些类型错误的键是处理尽可能靠近原始解析的HTML。虽然这样做,但要考虑元素的顺序并嵌入元素的上下文是很重要的。如果存在HTML解析器视图如何与Sunitize解析器视图如何视图节点的变化,则会出现词汇分析中的这些XSS问题。当不需要时,也可以建议黑名单MathML和SVG命名空间元素,并完全删除包含这些的任何请求(即,不继续将数据写入DOM)。

对于没有创建这些类型的解决方案但在其应用程序中包括它们的组织,良好的补丁政策将在预防剥削方面进行很大的补丁政策。我建议您检查这些库的最新版本,并在常规和组织定义的基础上修补它们。

除了代码/应用程序级别的安全控件之外,组织还应考虑将内容安全策略(CSP)实施到应用程序中。明确定义的CSP可以在浏览器定义的级别阻止JavaScript注入,从而创建抗辩安全姿势。此外,CSP应该避免指令,例如不安全内联或不安全 - eval,因为这些指令可以允许用户定义的内联JavaScript执行。有关CSP的更多信息,请参阅此信息文章。

即使在输入输入的输入时,xss仍然可以通过利用HTML如何解析和归库,通过任何消毒库都在使用。在测试此类类型的XS时,我建议使用各种命名空间和上下文切换元素进行模糊输入,记录任何有趣的结果,并解决这些结果。