前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊近期公开的几个GitLab高额奖金漏洞

聊聊近期公开的几个GitLab高额奖金漏洞

作者头像
泉哥
修改于 2023-09-23 11:14:17
修改于 2023-09-23 11:14:17
4.8K00
代码可运行
举报
文章被收录于专栏:漏洞战争漏洞战争
运行总次数:0
代码可运行

最近HackerOne上公开了几个GitLab的漏洞,奖金还不低,一些漏洞细节也已经公开,大多是业务逻辑漏洞,学习下。

漏洞一:issue迁移导致跨目录读取任意文件

【漏洞利用过程】

1、创建两个项目

2、在第一个项目中添加issue,描述内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)

3、将issue迁移至第二个项目

4、链接中的文件将被复制过去,用户可直接下载到/etc/passwd文件

【漏洞成因】

问题出在UploadsRewriter这个类中,在迁移issue时,它会重写markdown链接用来上传文件,漏洞出现在 lib/gitlab/gfm/uploads_rewriter.rb 中(居然是用ruby写的),对复制文件时未考虑到跨目录问题,导致可以上传任意文件到对应的链接上,进而被下载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @text.gsub(@pattern) do |markdown|
          file = find_file(@source_project, $~[:secret], $~[:file])
          break markdown unless file.try(:exists?)

          klass = target_parent.is_a?(Namespace) ? NamespaceFileUploader : FileUploader
          moved = klass.copy_to(file, target_parent)
...
   def find_file(project, secret, file)
        uploader = FileUploader.new(project, secret: secret)
        uploader.retrieve_from_store!(file)
        uploader
      end

漏洞修复

修复也很简单,添加对路径遍历的情况的检测就好:

漏洞二:Wiki附件上传导致任意文件读取

【漏洞利用过程】

1、创建新项目

2、创建wiki页面

3、在gitlab服务器创建测试文件:echo hello > /tmp/ggg;

4、攻击者本地创建垃圾文件:echo unused > /tmp/lala.txt

5、伪造参数上传wiki文件:

bash curl -g -XPOST -v -H "Authorization: Bearer

6、粘贴上面的markdown参数内容到wiki页面,然后下载文件

【漏洞成因】

GitLab Workhorse作为智能反向代理,专用于处理数据量大的请求,比如文件上传下载,它定义一组路由用来拦截对GitLab rails应用程序的访问, 也就是说,所有对 Rails 组件的请求都得经过 Workhorse,但有时也可能被绕过。

比如这里的用来上传wifi附件的漏洞CGI,正常情况下是指定本地文件路径参数file,但当你把这参数的字段名改成下面这些原本不存在的字段名时:

  • ;file
  • [file]
  • file]
  • ;file]
  • file]]
  • file;;

就会触发rewrite_filed的字段重置动作,导致原有字段file为nil空值,这会造成hash签名绕过,与此同时Multipart::Handler会去使用get参数中的file.path路径上传文件供下载,而不是特殊构造的[file]参数值。最终允许用户指定allowd_paths中的路径给rails组件处理,导致可以访问到以下路径范围内的本地磁盘文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       def allowed_paths
          [
            ::FileUploader.root,
            Gitlab.config.uploads.storage_path,
            JobArtifactUploader.workhorse_upload_path,
            File.join(Rails.root, 'public/uploads/tmp')
          ]
        end

作者是利用wiki中的上传文件链接来实现任意文件读取的,他使用 /proc/pid/fd/xx的方法读取其它用户的数据。

【漏洞修复】

如果gitlab把file.path参数放在post中应该也能防御,最后他们是添加对字段的检查判断,必须是顶级参数,而不是foo[bar]这种嵌套方式。

漏洞三:Git命令注入

【漏洞利用过程】

1、创建wiki页面,在commit消息中写入打算覆盖的文件内容,比如伪造ssh key

2、伪造ref参数发送请求,去篡改authorized_keys文件内容:

curl --header "PRIVATE-TOKEN: $TOKEN" 'http://gitlab-vm.local/api/v4/projects/5/search?scope=wiki_blobs&search=page&ref=--output=/var/opt/gitlab/.ssh/authorized_keys'

3、使用创建的ssh key登陆gitlab

【漏洞成因】

原因比较简单,就是ref参数直接被带入git命令中:

/opt/gitlab/embedded/bin/git --git-dir /var/opt/gitlab/git-data/repositories/@hashed/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a.wiki.git log --max-count=1 --output=/tmp/file

【漏洞修复】

很暴力简单,直接限制ref参数为--no-index,用户不再可控。

漏洞四:Issue评论附件SSRF漏洞

【漏洞利用过程】

1、创建新项目

2、创建issue

3、添加评论

4、导出项目

5、修改notes中的remote_attachment_url

6、重新打包导入

7、浏览评论,点击附件

【漏洞成因】

issue评论功能有添加附件下载的功能,这些下载地址正是由导出项目的project.json中的漏洞参数remote_attachment_url决定的,修改后重新导入会使其生效,再点击下载时就触发伪造请求,访问到内部服务。

【漏洞修复】

添加了remote_attachment_request_header的散列值,并将其添加到AttributeCleaner方法中,使得攻击者无法添加去伪造请求。

总结

多个gitlab漏洞都是基于对业务功能的了解,手工测试+代码审计挖到的可能性较大,每个功能与业务功能逻辑关系很紧密,像漏洞一,似乎你不看代码都不知道有拷贝文件,自然更然想到这个攻击点。像挖这种偏业务逻辑漏洞的,很大程度上取决你对业务功能和安全边界的理解,也耗体力,又看见是ruby写的,我瞬间都没想法了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞战争 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
初识Linux · 软硬链接
前文我们介绍了磁盘系统的理解,并且基于磁盘系统对文件系统的整体框架有了一个简单的理解,我们都是通过“想要见识没有打开的文件”这个话题引出来了以上的两个主题,紧随其后的,是软硬链接部分,对于软硬链接部分,我们仍然从是什么 为什么 怎么做来了解这部分的知识点。
_lazy
2024/11/19
1420
初识Linux · 软硬链接
详解 Linux 中的硬链接与软链接
在 Windows 中安装应用程序,通常安装向导会提示是否创建桌面快捷方式。如果选择同意创建,安装完成后会在桌面上看到对应应用程序的图标,如果想要使用这个应用程序只需要双击桌面上的快捷方式即可,这就是 Windows 中的快捷方式。Linux 链接文件类似于 Windows 中的快捷方式,Linux 链接文件分为硬链接和软链接,不过在具体介绍 Linux 中的硬链接和软链接之前,先来看看 Linux 文件系统中文件的具体结构。
触摸壹缕阳光
2020/09/01
12.8K2
Linux文件的软链接和硬链接
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。
恋喵大鲤鱼
2018/08/03
8.1K0
Linux 软硬链接
inode是一组描述文件的数据,包括文件类型,权限,以及最重要的一点文件数据所在的数据池,inode在inode表中以数字形式表示。
Yif
2019/12/26
3.6K0
【Linux】开始认识软硬链接
然后我们怎么寻找一个文件呢: 要找到指定文件 -> 首先要找到所在目录(逆向解析路径) ->找到文件的inode编号 -> 打开文件 操作系统必须通过路径来确定文件!!!
叫我龙翔
2024/05/05
1380
【Linux】开始认识软硬链接
软链接 vs. 硬链接
要想理解硬链接和软链接的区别,首先要明白什么是 Inode。Inode 是 Index node,索引节点的意思。每个文件都有一个 inode,里边保存着文件的元数据(meta data),包括:inode 号、文件大小、文件所有者、文件权限、文件类型、创建时间、硬链接数等等,除了文件名以外的所有文件信息都存储在这里。它是文件或者目录在一个文件系统中的唯一标识。
Coding十日谈
2020/08/13
1.3K0
软链接 vs. 硬链接
软硬链接的作业
软链接又叫符号链接,和原文件不是一个文件,类似Windows的快捷方式,如果原始文件被删除,所有指向它的符号链接也就都被破坏了
盛透侧视攻城狮
2024/10/21
880
软硬链接的作业
【Linux探索学习】第二十四弹——软硬链接:Linux 中的软链接与硬链接详解
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2024/12/28
2110
【Linux探索学习】第二十四弹——软硬链接:Linux 中的软链接与硬链接详解
细谈linux软硬链接
​ 对于软连接,在 linux 中,我们可以使用 ln (link)指令带上 -s 选项来生成一个指定文件的软链接!
利刃大大
2023/04/12
4.5K0
细谈linux软硬链接
【Linux】理解文件系统——软硬链接
我们之前讨论的都是进程和被打开文件的关系,而如果一个文件是没有被打开呢?没有被打开的文件操作系统如何管理?
平凡的人1
2023/10/15
4880
【Linux】理解文件系统——软硬链接
【Linux课程学习】:站在文件系统之上理解:软硬链接,软硬链接的区别
https://blog.csdn.net/djdjiejsn/category_12669243.html
用户11396661
2024/12/09
1800
【Linux课程学习】:站在文件系统之上理解:软硬链接,软硬链接的区别
Linux硬链接,软链接
文件是存储在硬盘上的,硬盘最小单位叫扇区(sector),每个扇区存储512字节。操作系统读取硬盘的时候,如果一个一个读取那效率很低,因此一次性读取多个扇区,即一次性读取一个块(block)。这种多个扇区组成的块,就是文件存取的最小单位。block的大小最常见的是4KB,即连续8个sector组成一个block。
doper
2022/08/23
10.5K0
【Linux】软硬链接和动静态库
  在Linux系统中,文件链接分为两种类型:硬链接(Hard Link)和软链接(也称为符号链接或Symbolic Link)。它们都是用于创建文件的额外入口点,但是工作原理和使用场景有所不同。
大耳朵土土垚
2024/11/10
2330
【Linux】软硬链接和动静态库
【Linux基础IO】从零到一:文件管理系统深度探索
前言:在Linux操作系统的广阔世界中,文件管理无疑是基石之一,它支撑着整个系统的稳定运行与高效运作。无论是日常办公、软件开发、服务器管理还是大数据处理,都离不开对文件系统的深入理解和熟练操作。因此,掌握Linux基础IO中的文件管理技能,对于每一个Linux用户、系统管理员以及开发者而言,都是至关重要的
Eternity._
2024/09/28
1780
【Linux基础IO】从零到一:文件管理系统深度探索
linux软链接和硬链接
硬链接相当于一个灾备系统,数据存放在两处,与复制不同的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外一处数据如果被删除了,不会影响到另一处的数据.
阳光岛主
2019/02/19
9.1K0
Linux硬链接与软链接
在Linux中,连接文件有两种,一种类似于Windows的快捷方式,可以让你快速地链接到目标文件(或目录),这种称为软链接(soft link),也叫作符号链接(symbolic link);另一种则是通过文件系统的 inode 连接来产生新文件名,而不是产生新文件。这种称为硬链接(hard link),也叫作实体链接。 软链接与硬链接是两种完全不一样的东西。
恋喵大鲤鱼
2019/03/04
23.8K1
Linux硬链接与软链接
Linux文件管理
对于计算机来说,所谓的数据就是0和1的序列。这样的一个序列可以存储在内存中,但内存中的数据会随着关机而消失。为了将数据长久保存,我们把数据存储在光盘或者硬盘中。根据我们的需要,我们通常会将数据分开保存到文件这样一个个的小单位中(所谓的小,是相对于所有的数据而言)。但如果数据只能组织为文件的话,而不能分类的话,文件还是会杂乱无章。每次我们搜索某一个文件,就要一个文件又一个文件地检查,太过麻烦。文件系统(file system)是就是文件在逻辑上组织形式,它以一种更加清晰的方式来存放各个文件。 路径与文件简介
Vamei
2018/01/18
2K0
Linux文件管理
理解文件系统/inode的概念/磁盘/软硬链接
文件操作的本质是进程与被打开的文件之间的关系。那么没有被打开的文件怎么办?OS如何去管理它们?没有被打开的文件,安安静静地在磁盘里面放着,磁盘中存在大量的文件,这些没有被打开的文件,被OS静态管理起来,方便随时打开。管理被打开文件,叫做文件系统,虚拟文件系统,管理没有被打开的文件,也称为文件系统,躺着的文件系统。
二肥是只大懒蓝猫
2023/03/30
1.6K0
理解文件系统/inode的概念/磁盘/软硬链接
【Linux】详解软硬链接
ln就是link的意思,-s表示软链接,test.txt要建立软链接的文件名,后面跟上要建立的软链接文件名。
用户10923276
2024/04/02
2170
【Linux】详解软硬链接
Linux:软链接和硬链接的理解
Linux ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
鲲志说
2025/04/07
1760
Linux:软链接和硬链接的理解
相关推荐
初识Linux · 软硬链接
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档