携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
HTML 注入
超文本标记语言 (HTML) 注入是一种技术,用于利用未经验证的输入来修改 Web 应用程序向其用户呈现的网页。攻击者利用网页内容通常与以前与用户的交互相关这一事实。当应用程序无法验证用户数据时,攻击者可以发送 HTML 格式的文本来修改呈现给其他用户的网站内容。专门制作的查询可能导致在网页中包含攻击者控制的HTML元素,这些元素会改变应用程序内容向Web公开的方式。
详细说明
HTML 是一种语言,用于确定应用程序数据(如产品目录)如何在其 Web 浏览器中呈现给用户。此语言包含可视化命令,如页面背景的颜色和嵌入图片的大小。它还包含指向其他网页的链接,以及用于用户浏览器的其他命令。此外,代表用户从 Web 收集有用信息的自动化工具通常通过系统地访问和分析应用程序 HTML 页面中的相关信息来执行此操作。
在现代交互式网页中,网页的内容通常反映处理先前用户操作的结果。如果用户的输入未经过验证并且应用程序容易受到攻击,则攻击者可以手工创建输入并将其发送到应用程序,从而使他将 HTML 代码片段注入到应用程序响应的 HTML 内容中。
HTML注入攻击与跨站点脚本(XSS)密切相关。HTML注入使用HTML来破坏页面。顾名思义,XSS将JavaScript注入页面。这两种攻击都利用了对用户输入的验证不足。
搜索结果页的 Web 应用程序模板:
<html>
<h1>Here are the results that match your query: </h1>
<h2>{user-query}</h2>
<ol>
<li>Result A
<li>Result B
</ol>
</html>
用户查询文本:
</h2>special offer <a href=www.attacker.site>malicious link</a><h2>
注入后生成的结果页面:
<html>
<h1>Here are the results that match your query: </h1>
<h2> </h2>special offer <a href=www.attacker.site>malicious link</a><h2> </h2>
<ol>
<li>Result A
<li>Result B
</ol>
</html>
当然,攻击者的目标是将 HTML 注入其他用户或自动工具看到的页面,而不是注入他在浏览器中看到的网页,如前面的示例所示。为此,注入文本必须成为为其他用户生成并由其他用户查看的页面内容的一部分。如果应用程序存储未经验证的用户输入并向其他用户显示数据,则会发生注入。假设上面的应用程序也有一个页面显示用户搜索的历史记录:
搜索历史记录页面的 Web 应用程序模板:
<html>
<h1>Recent users queries:</h1>
<ol>
<li><h2>{user-query-1}</h2>
<li><h2>{user-query-2}</h2>
</ol>
</html>
HTML注入后生成的搜索历史记录页面:
<html>
<h1>Recent users queries:</h1>
<ol>
<li><h2>funny cat movies</h2>
<li><h2> </h2>special offer <a href=www.attacker.site>malicious link</a><h2> </h2>
</ol>
</html>
现在,每个将浏览到搜索结果页面的用户都将看到攻击者注入的链接。如果毫无戒心的用户信任应用程序并单击它现在包含的注入链接,则他突然看到来自攻击者控制的域的内容。
存储一个用户的输入并将其显示给其他用户的典型应用程序用例是,当应用程序包含用户可以对页面的原始内容发表评论或相互交互的页面时。这是应用程序漏洞可能导致 HTML 注入的另一个示例。
预防
检测 HTML 注入的最常见方法是在包含用户输入的传入 HTTP 流中查找 HTML 元素。对用户输入的朴素验证只是从任何用户提供的文本中删除任何HTML语法子字符串(如标记和链接)。但是,在许多情况下,应用程序需要来自用户的 HTML 输入。例如,当用户提交视觉设置格式的文本或包含指向具有相关内容的合法网站的链接的文本时,就会发生这种情况。为了避免误报,检测可能的注入并保护应用程序的安全机制应了解在哪个应用程序上下文中允许用户输入包含 HTML。此外,如果它了解到此类文本按原样粘贴在由易受攻击的应用程序组件生成的网页中,则应该能够停止 HTML 输入。