Go SSTI

前言

555学习。


环境搭建

直接用docker搭建环境,首先下载一个golang镜像:

1
docker pull golang

开启镜像后,在/go/src目录下新建ssti模块,并初始化包管理工具,类似nodejs的npm:

1
go mod init

直接使用参考文章的测试代码,然后编译:

1
go install ssti

在/go/bin目录下找到编译好的二进制程序并运行。

SSTI

成因简单来说就是text/template模板将外来输入作为了模板代码解析,类似SQL注入、表达式注入等漏洞,而根据文档,html/template模板则会过滤用户输入,但是似乎只做了XSS过滤,所以不会影响SSTI利用。

根据参考文章,主要利用方向有三个。

信息泄露

模板引擎允许用户将一个存储数据的对象绑定到模板中,并在渲染时读取其中的数据,因此SSTI可以读取该对象中的数据,如:

1
{{.Passwd}}

或者打印整个对象:

1
{{.}}

函数调用

可以调用环境中定义的函数,如:

1
{{.Secret "pwd"}}

XSS

可以通过调用输出函数打印JavaScript的方式进行XSS,如:

1
{{with $x := "<script></script>"}}{{print $x}}{{end}}

但是无法绕过模板过滤。


参考

Go语言下的模板注入


Go SSTI
http://yoursite.com/2023/06/29/Go-SSTI/
作者
Aluvion
发布于
2023年6月29日
许可协议