声明
本文属于OneTS安全团队成员98的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
Gin框架是什么
Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。
如何开始
Gin 需要Go版本1.21或更高版本。
通过使用Go的modules时(https://go.dev/wiki/Modules#how-to-use-modules)
例如:go [build|run|test],会自动安装必要的依赖项
import "github.com/gin-gonic/gin"或go get -u github.com/gin-gonic/gin
如下为一个简单的样例:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
ClientIP绕过
通常在Gin中,我们使用类似如下的函数
func xx(c *gin.Context){ ip := c.ClientIP() }
这里不禁思考是否存在绕过
尝试发起如下请求进行爆破
结果为X-Forwarded-For和X-Real-IP能够绕过
跟进源码
代码位于:
github.com\gin-gonic\gin@v1.10.0\context.go
c.ClientIP()大概逻辑是:检测c.engine.TrustedPlatform是否为可信任地址且不为空,如果是则返回该地址;检测c.engine.AppEngine是否为True,且X-Appengine-Remote-Addr头不为空;检查远程 IP 是否是受信任的代理,这里仅检测XFF和X-Real-IP两个头(看跟进结果)。 |
---|
github.com\gin-gonic\gin@v1.10.0\gin.go
绕过之后
绕过之后能做什么?不管是路由爆破还是访问原本访问不了的站点都能进行更进一步的测试,之前就遇到了绕过之后翻JS获取到jwt密钥,通过构造认证参数进入后台从而RCE,这里就不进一步展开讲了。