IPBUF安全漏洞报告
English
CVE-2026-39826 CVSS 6.1 中危

CVE-2026-39826 Go模板XSS漏洞

披露日期: 2026-05-07

漏洞信息

漏洞编号
CVE-2026-39826
漏洞类型
跨站脚本攻击 (XSS)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Go (Golang)

相关标签

XSSGoGolangTemplate InjectionWeb SecurityCWE-79

漏洞概述

该漏洞存在于Go语言的模板引擎中。当受信任的模板作者编写包含空'type'属性或包含ASCII空白字符的'type'属性的<script>标签时,模板执行将错误地转义传递到<script>块中的任何数据。这可能导致攻击者注入恶意脚本代码并在用户浏览器中执行,从而窃取敏感信息或进行会话劫持。

技术细节

Go的html/template包旨在通过上下文感知的自动转义机制来防御XSS攻击,它会根据内容所在的HTML上下文(如JavaScript块、CSS块、URL属性)选择合适的转义策略。然而,当<script>标签的type属性为空或仅包含ASCII空白字符(例如type=" "或type="")时,根据HTML5规范,这应被视为JavaScript代码块。但在该漏洞中,模板解析器未能正确识别这一特定上下文,导致其错误地认为内容不需要进行严格的JavaScript转义。因此,当未经过滤的用户输入被渲染到此类<script>标签内部时,恶意payloads(如</script><img src=x onerror=alert(1)>)将不会被转义,从而直接在浏览器中执行。利用此漏洞需要攻击者能够控制传递到该特定模板上下文的数据,并诱导受害者访问生成的页面。

攻击链分析

STEP 1
侦察
攻击者识别使用Go语言模板引擎渲染HTML页面的目标应用程序。
STEP 2
武器化
攻击者构造包含恶意JavaScript代码的Payload,旨在利用模板引擎对特定script标签的转义缺陷。
STEP 3
交付
攻击者通过输入字段(如表单、URL参数)将恶意Payload提交给服务器。
STEP 4
利用
服务器端使用存在漏洞的Go模板渲染数据,由于type属性为空或含空白,Payload未被正确转义。
STEP 5
执行
受害者访问被渲染的恶意页面,浏览器执行注入的脚本,导致XSS攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "html/template" "os" ) func main() { // Vulnerable template: script tag with empty type attribute // or type attribute containing only whitespace tmplStr := `<script type=" ">{{ . }}</script>` tmpl, _ := template.New("test").Parse(tmplStr) // Malicious input that breaks out of the script block // In a vulnerable version, this might not be escaped correctly inside the script tag payload := `</script><script>alert('XSS')</script>` tmpl.Execute(os.Stdout, payload) }

影响范围

Go (Golang) (Specific versions referenced in go.dev/cl/771180)

防御指南

临时缓解措施
临时缓解措施包括全面审计所有Go模板文件,确保<script>标签的type属性具有明确的值(如type="text/javascript"),或者完全移除type属性并确保模板引擎正确处理。此外,对所有用户输入进行严格的过滤和验证,防止特殊字符进入模板渲染上下文。

参考链接