gin框架出現遍歷目錄的bug

一、 問題描述

在使用 gin 框架的時候,出現了線上漏洞,即可以通過 url 遍歷目錄。添加了對權限的控制。在後續的項目中,也需要用到 ctx.File(filename string) 函數。開始時想要使用 StripPrefix 但由於其他原因放棄了。

二、代碼復現

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

fun main(){
	router := gin.Default()
	router.GET("txt", GetText)
	router.Run()
}

func GetText(ctx *gin.Context){
	fileName := ctx.Query("name")
	ctx.File(fileName)
}

使用 POSTMAN 測試,未發現異常。然後將 fileName 寫成本地的全路徑 /home/dir1/dir2/dir3/txt1 。在訪問時使用 http://localhost:8080/txt?name=/home/dir1/dir2/dir3/txt1 時,故意把 txt1 去掉,也不可能遍歷目錄。

比較兩之前出問題的代碼,問題出在路由裏。問題代碼如下:

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

fun main(){
	router := gin.Default()
	router.GET("txt/*name", GetText) // (1)
	router.Run()
}

func GetText(ctx *gin.Context){
	fileName := ctx.Param("name")
	ctx.File(fileName)
}

在上述代碼中的 (1) 可以看到,路由是通過path 路徑傳遞。測試也發現是可以通過url遍歷文件目錄的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章