作者:@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 Pagetitle>head>
<body>
…
有一个小瑕疵:头部缺少 charset 属性。charset 是一组计算机可以用来表示文本的字符集。这听起来可能不是大问题,但攻击者可以轻易利用这一点,通过有意改变浏览器假设的字符集来注入任意的 JavaScript 代码到网站中。
要点
Content-Type
头中的 charset
属性缺失或不正确,可能导致浏览器在解析 HTML 文档时使用错误的字符编码,从而为攻击者提供注入恶意 JavaScript 代码的机会。
【第3335期】XSS终结者-CSP理论与实践
分析
字符编码的重要性
浏览器的行为
攻击者的利用
攻击者可以利用字符编码的不确定性,通过特定的字符编码(如 ISO-2022-JP)来绕过安全检查,注入恶意 JavaScript 代码。
例如,ISO-2022-JP 编码中的特定转义序列可以欺骗浏览器的自动检测机制,使其错误地认为响应体使用 ISO-2022-JP 编码,从而导致安全漏洞。
攻击者可以根据自己的能力使用两种不同的利用技术来利用 IOS-2022-JP 字符集:
否定反斜杠转义:此技术可用于否定原本用于转义的反斜杠,例如在 JavaScript 字符串上下文中,原本用于转义的双引号。
打破 HTML 上下文:通常在支持 Markdown 的网站中使用,此技术要求攻击者控制两个不同的 HTML 上下文。通过消耗指定 HTML 上下文结束的 HTML 特殊字符,此技术允许攻击者将数据注入到非预期的 HTML 上下文。
这两种技术都可以被攻击者用于将恶意的 JavaScript 代码注入到网站中。
影响
安全风险
行业影响
结论
Content-Type
头中的 charset
属性对于确保浏览器正确解析 HTML 文档至关重要。开发者在编写和部署代码时,应始终确保正确设置 charset
属性,以防止潜在的安全漏洞。未来,随着浏览器和 Web 标准的进一步发展,字符编码的处理可能会变得更加严格,但在此之前,开发者需要保持警惕,确保其应用的安全性。
【第3241期】利用Png做持久型XSS攻击
AI 阅:了解技术资讯的一种方式。有兴趣可直接查看原文了解。