一、 問題描述
在使用 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遍歷文件目錄的。