LEXSS绕过词法解析过程中的安全机制

雨笋教育小编今日这篇分享:关于XSS漏洞攻击的案例分析,本文除了概念介绍,还详细举了两个案例,接下来就往下文看看吧!

通过使用基于HTML解析逻辑的特殊HTML标签,可以实现跨站脚本(XSS)攻击,即使在使用词法解析器过滤危险内容的情况下也是如此。利用这些类型的XSS漏洞的主要目标,就是让净化型词法解析器将数据视为文本数据,而不是计算机指令(例如,JavaScript指令)。当HTML解析器和净化型词法解析器没有以相同的方式解析数据时,就有可能导致这种类型的攻击。

关键概念介绍

注意:对本文来说,我们假定读者已经接触过XSS(更准确的说是JavaScript注入)方面的知识,并且对HTML有基本的了解。要想了解更多的入门知识,请参阅之前往期的渗透基础知识。

针对XSS漏洞的保护措施

实际上,针对XSS漏洞的保护措施有多种形式。比如,早期的防御措施,就是利用正则表达式(regex)来检查用户输入的“危险”字符串。一个简化的例子是,如果用户提供的输入包含

script

,那么,就通过正则表达式找到该字符串并将其删除。然而,这种基于正则表达式的XSS保护措施经常出现失误,因为可以通过各种方法构造出能够顺利绕过正则表达式的JavaScript代码串。对于上面的例子来说,只需将

script

中的一个字母变为大写(如

scRipt

),就可以绕过这种过滤器,从而导致XSS攻击。因此,我们不建议使用正则表达式过滤器来防御XSS。所以,让我们来谈谈更好的解决方案。上下文输出编码是另一种XSS保护形式,它会将特殊字符(如“”和“”)转化为无害的HTML编码输出(例如,“

lt;

”和“

gt;

”)。这种形式的保护将用户的输入放在源文件中,以确保所有可能导致JavaScript执行或HTML渲染的JavaScript或HTML可用字符都转换为不危险的HTML实体编码形式。这是处理在应用程序中呈现的用户输入的好方法;事实上,许多现代前端框架都会默认进行输出编码(例如,ReactJS和Angular)。然而,这种形式的保护会对应用程序施加某些限制,也就是禁止用户使用某些支持富文本的HTML特性。如果用户需要支持某些HTML特性,如图片、链接和富文本等,那该怎么办呢?这就是词法解析发挥作用的地方。

通过词法解析防御XSS攻击

词法解析是一种非常复杂的XSS防御手段,因为它在执行额外的逻辑(如对数据进行分块或编码)之前,会评估数据是指令还是明文。抽象的说,词法解析可以被描述为将用户数据(即不危险的文本内容)与计算机指令(即JavaScript和某些危险的HTML标签)分离开来的过程。在想让用户使用HTML子集的情况下,这种类型的解析可以用来确定哪些是允许的内容,哪些将被阻止或过滤掉。

上面所说的想让用户使用的HTML子集的例子,包括富文本编辑器、电子邮件客户端、What-You-See-Is-What-You-Get(WYSIWYG)HTML编辑器,如TinyMCE或Froala,以及DOMPurify等净化库。在这些例子中,这种形式的词法解析保护是非常常见的。

然而,当HTML解析器和净化型词法解析器不是以完全相同的方式处理数据时,就可以将词法解析作为一种XSS保护形式。这篇文章主要讨论在某些情况下,尽管有复杂的保护措施,但仍有可能通过利用HTML解析逻辑来欺骗词法解析器,注入JavaScript代码。为了了解如何利用这些XSS问题,我们必须首先考察HTML是如何解析的;数据处理过程中的注意事项和特殊情况;以及净化型解析器是如何工作的。

数据是如何流经HTML解析器的

要了解我们如何在一个对HTML输入应用词法解析的应用程序中实现XSS攻击,我们首先必须看看HTML是如何被解析的,以及如何确定内容是数据还是指令。下图展示的是HTML解析器的操作顺序:现在,我们对这些步骤简单加以说明:

网络阶段:这个阶段指的是将输入作为字节传输给解析器。分词器阶段:分词是进行词法解析的地方。解析器将把文本数据与计算机指令分开。要做到这一点,分词器将根据它遇到的元素在数据状态之间切换上下文,并将值作为单词返回。这将在“上下文状态”部分详细介绍。树形结构阶段:从分词器阶段返回的单词被放置在一个树形结构中;每个树形分支都被称为一个节点。为了更清楚地了解它们在实践中到底是什么样子的,让我们来看看下面的HTML片段:!DOCTYPEhtmlbodydivHelloWorldahref=


转载请注明:http://www.aierlanlan.com/grrz/2434.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了