GO SSTI
GO SSTI
SSTI
识别方法
代码中引入了text/template
,会导致SSTI漏洞出现
运算符号在{{}}
中是非法的,需要使用其他payload,比如占位符号{{.}}
,如果存在ssti,那么就无回显
信息泄露
1 | package main |
go通过结构体来类比一个对象,一个子段就是一个对象的属性,模版渲染也支持传入一个结构体的实例来渲染字段,上面代码中,name部分可控,可以仿造{{ .Name}}
,构造{{.Passw}}
,得到Passwd字段
user := &User{1, "tyskill", "tyskill"}
使用了模版&User
因此{{.Passwd}}
可以得到它的属性
直接用.可以得到模版的全部内容
防御
拒绝拼接,直接传入.字段名
1 | func StringTpl2Exam(w http.ResponseWriter, r *http.Request) { |
XSS
go模版会打印字符串,如果是xss代码的话,也会直接执行,这个xss是拒绝拼接也无法防御的
1 | {{"<script>alert(/xss/)</script>"}} |
编码行为
1 | {{define "T1"}}ONE{{end}}{{template "T1"}} |
{template "name"}}
执行名为name的模板,提供给模板的参数为nil,如模板不存在输出为””{{define "name"}`模板内容`{{end}}}
定义一个名为name的模板
这里实际上就是一个我们进行模板的定义,并输出的过程,这样我们就可以顺利的实现XSS了
防御方法
1.内置函数html转义特殊字符
1 | {{html "<script>alert(/xss/)</script>"}} |
2.text/template
在模版处理阶段还定义template.HTMLEscapeString
等转义函数
3.html/template
模版包自带转义效果
命令执行&任意文件读取
可以像{{ .Name}}
一样调用对象方法,模板内部并不存在可以RCE的函数,所以除非有人为渲染对象定义了RCE或文件读取的方法,不然这个问题是不存在的。
1 | func (u *User) System(cmd string, arg ...string) string { |
如果定义了就可以通过{{.System "whoami"}}
和{{.FileRead "filepath"}}
执行
正常程序猿都不会定义这么危险的函数
- 标题: GO SSTI
- 作者: Sl0th
- 创建于 : 2023-03-13 22:43:14
- 更新于 : 2024-11-11 18:23:06
- 链接: http://sl0th.top/2023/03/13/GO-SSTI/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论