【早阅】编码差异:为什么字符集很重要

科技   2024-10-24 08:01   福建  

作者:@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 代码的机会。

【第3335期】XSS终结者-CSP理论与实践

分析

字符编码的重要性

  • 字符编码(如 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 标准的进一步发展,字符编码的处理可能会变得更加严格,但在此之前,开发者需要保持警惕,确保其应用的安全性。

【第3241期】利用Png做持久型XSS攻击

AI 阅:了解技术资讯的一种方式。有兴趣可直接查看原文了解。


前端早读课
探索前端技术,体验产品的情感, 项目思考的指引,塑造独立开发者的未来。
 最新文章