作者:@Stefan Schiller
原文:https://thenewstack.io/encoding-differentials-why-charset-matters/
背景
关于 HTTP 响应中的字符编码(charset)的问题引起了广泛关注。具体来说,一个常见的 HTTP 响应示例中,Content-Type
头缺少了 charset
属性,这可能导致跨站脚本(XSS)漏洞。
可能存在跨站脚本的漏洞风险,如下:
HTTP/1.1 200 OK
Server: Some Server
Content-Type: text/html
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>Some Page</title></head>
<body>
…
有一个小瑕疵:头部缺少 charset 属性。charset 是一组计算机可以用来表示文本的字符集。这听起来可能不是大问题,但攻击者可以轻易利用这一点,通过有意改变浏览器假设的字符集来注入任意的 JavaScript 代码到网站中。
要点
Content-Type
头中的 charset
属性缺失或不正确,可能导致浏览器在解析 HTML 文档时使用错误的字符编码,从而为攻击者提供注入恶意 JavaScript 代码的机会。
分析
字符编码的重要性
字符编码(如 UTF-8、ISO-8859-1 等)定义了字符与字节之间的映射关系。浏览器需要知道服务器使用的字符编码,以便正确解码 HTTP 响应体中的字节。
如果
Content-Type
头中缺少charset
属性,浏览器可能会尝试自动检测字符编码,但这可能会导致错误的编码选择。
浏览器的行为
当
Content-Type
头中没有charset
属性时,浏览器会尝试从 HTML 文档中的<meta>
标签或字节顺序标记(BOM)中获取字符编码信息。如果这些信息都缺失,浏览器会使用自动检测机制(如 Chromium 的 Compact Encoding Detection 库)来猜测字符编码。
攻击者的利用
攻击者可以利用字符编码的不确定性,通过特定的字符编码(如 ISO-2022-JP)来绕过安全检查,注入恶意 JavaScript 代码。
例如,ISO-2022-JP 编码中的特定转义序列可以欺骗浏览器的自动检测机制,使其错误地认为响应体使用 ISO-2022-JP 编码,从而导致安全漏洞。
攻击者可以根据自己的能力使用两种不同的利用技术来利用 IOS-2022-JP 字符集:
否定反斜杠转义:此技术可用于否定原本用于转义的反斜杠,例如在 JavaScript 字符串上下文中,原本用于转义的双引号。
打破 HTML 上下文:通常在支持 Markdown 的网站中使用,此技术要求攻击者控制两个不同的 HTML 上下文。通过消耗指定 HTML 上下文结束的 HTML 特殊字符,此技术允许攻击者将数据注入到非预期的 HTML 上下文。
这两种技术都可以被攻击者用于将恶意的 JavaScript 代码注入到网站中。
影响
安全风险
缺少
charset
属性或错误的字符编码设置可能导致严重的 XSS 漏洞,攻击者可以借此注入恶意代码,窃取用户数据或执行其他恶意操作。
行业影响
这一问题不仅影响单个网站,还可能影响整个互联网生态系统,因为许多网站可能未正确设置
charset
属性。随着浏览器技术的不断发展,自动检测机制可能会变得更加复杂,但这也意味着攻击者有更多机会利用这些机制中的漏洞。
结论
Content-Type
头中的 charset
属性对于确保浏览器正确解析 HTML 文档至关重要。开发者在编写和部署代码时,应始终确保正确设置 charset
属性,以防止潜在的安全漏洞。未来,随着浏览器和 Web 标准的进一步发展,字符编码的处理可能会变得更加严格,但在此之前,开发者需要保持警惕,确保其应用的安全性。
AI 阅:了解技术资讯的一种方式。有兴趣可直接查看原文了解。