加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

浅析Go下的Ssti漏洞问题

发布时间:2023-10-03 11:12:34 所属栏目:安全 来源:
导读:作为强类型的静态语言,golang的安全属性从编译过程就能够避免大多数安全问题,一般来说也唯有依赖库和开发者自己所编写的操作漏洞,才有可能形成漏洞利用点,在本文,主要学习探讨一下golang的一些ssti模板注入问题

作为强类型的静态语言,golang的安全属性从编译过程就能够避免大多数安全问题,一般来说也唯有依赖库和开发者自己所编写的操作漏洞,才有可能形成漏洞利用点,在本文,主要学习探讨一下golang的一些ssti模板注入问题。

template之所以称作为模板的原因就是其由静态内容和动态内容所组成,可以根据动态内容的变化而生成不同的内容信息交由客户端,以下即一个简单例子

复制

模板内容 Hello, {{.Name}} Welcome to go web programming…

期待输出 Hello, liumiaocn Welcome to go web programming…

而作为go所提供的模板包,text/template和html/template的主要区别就在于对于特殊字符的转义与转义函数的不同,但其原理基本一致,均是动静态内容结合,以下是两种模板的简单演示。

text/template

package main

import (

"net/http"

"text/template"

)

type User struct {

ID int

Name string

Email string

Password string

}

func StringTpl2Exam(w http.ResponseWriter, r *http.Request) {

user := &User{1,"John", "test@example.com", "test123"}

r.ParseForm()

tpl := `<h1>Hi, {{ .Name }}</h1><br>Your Email is {{ .Email }}`

data := map[string]string{

"Name": user.Name,

"Email": user.Email,

}

html := template.Must(template.New("login").Parse(tpl))

html.Execute(w, data)

}

func main() {

server := http.Server{

Addr: "127.0.0.1:8888",

}

http.HandleFunc("/string", StringTpl2Exam)

server.ListenAndServe()

}

struct是定义了的一个结构体,在go中,我们是通过结构体来类比一个对象,因此他的字段就是一个对象的属性,在该实例中,我们所期待的输出内容为下

模板内容 <h1>Hi, {{ .Name }}</h1><br>Your Email is {{ .Email }}

期待输出 <h1>Hi, John</h1><br>Your Email is test@example.com

可以看得出来,当传入参数可控时,就会经过动态内容生成不同的内容,而我们又可以知道,go模板是提供字符串打印功能的,我们就有机会实现xss。

package main

import (

"net/http"

"text/template"

)

type User struct {

ID int

Name string

Email string

Password string

}

func StringTpl2Exam(w http.ResponseWriter, r *http.Request) {

user := &User{1,"John", "test@example.com", "test123"}

r.ParseForm()

tpl := `<h1>Hi, {{"<script>alert(/xss/)</script>"}}</h1><br>Your Email is {{ .Email }}`

data := map[string]string{

"Name": user.Name,

"Email": user.Email,

}

html := template.Must(template.New("login").Parse(tpl))

html.Execute(w, data)

}

func main() {

server := http.Server{

Addr: "127.0.0.1:8888",

}

http.HandleFunc("/string", StringTpl2Exam)

server.ListenAndServe()

}

模板内容 <h1>Hi, {{"<script>alert(/xss/)</script>"}}</h1><br>Your Email is {{ .Email }}

期待输出 <h1>Hi, {{"<script>alert(/xss/)</script>"}}</h1><br>Your Email is test@example.com

实际输出 弹出/xss/

这里就是text/template和html/template的最大不同了。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章