Git源代码泄露利用技巧

如果在部署应用时没有及时删除.git目录或做访问限制,便会造成.git目录泄露,这种情况在渗透和做CTF题的时候经常遇到,这次便简单介绍下.git泄露的利用方式

认识Git

什么是git泄露

Git是一种分布式版本控制系统,可以用于跟踪文件的变化,记录每次修改的内容,以便开发者随时查案历史版本,并回溯到任意版本

使用git init指令可以初始化一个git仓库,而仓库的相关配置文件就保存在当前目录下的隐藏目录.git中。如果在部署应用时未及时删除.git目录,并且未对目录访问进行限制,便会导致出现git泄露漏洞

由于git仓库中存储了项目的源代码、配置文件和敏感信息,一旦泄露将导致攻击者可以获取到代码和信息,对系统发起进一步攻击

git泄露通常是通过目录扫描发现,存在git相关访问路径说明存在git源代码泄露漏洞

image.png

.git目录结构

.git目录是Git版本控制系统中存储仓库信息的核心目录,其文件结构如下

  • COMMIT_EDITMSG:保存最新的提交信息
  • HEAD:指向当前分支,或者指向当前所在的提交
  • objects:存储了Git的对象数据库,包括所有的文件内容、目录结构和提交信息,使用文件哈希值作为文件名
  • refs:存储分支、标签等引用信息
  • config:存储仓库配置信息,如用户信息、远程仓库地址、默认分支等
  • index:暂存区的索引文件,记录了暂存区中的文件列表、文件状态和文件哈希值等信息
  • logs:存储了引用日志信息,记录分支的变更历史
  • hooks:存储包含了Git的钩子脚本,开发者可以在特定的Git操作(如提交、合并)前后执行自定义的脚本
  • description:仓库的描述信息,主要给gitweb等网站托管系统使用
  • info:包含仓库的一些信息

在上面的文件中,objects目录需要重点关注,因为源代码文件通常就保存在其中

利用工具

wget

适用于git源代码泄露漏洞和列目录漏洞同时出现,递归下载.git目录下的所有文件

1
wget -r http://xxx.xxx.com/.git

image.png

GitHacker

仓库地址:https://github.com/WangYihang/GitHacker

多线程git泄露利用工具,可以完整的下载整个git目录,更适用无法直接访问git目录的时候下载目录

一条指令快速安装

1
python3 -m pip install -i https://pypi.org/simple/ GitHacker

安装后在任何位置都可以直接调用GitHacker

image.png

使用只需要指定url地址和文件保存路径

1
GitHacker --url http://xx.xxx.com/.git --output-folder output

dumpall

仓库地址:https://github.com/0xHJK/dumpall

一款信息泄漏利用工具,适用于.git/.svn/.DS_Store泄漏和目录列出

1
python dumpall.py -u http://xx.xxx.com/.git

使用局限性较高,只能下载git解析后的代码源文件,不能下载整个.git隐藏目录

image.png

Git常用指令

git信息泄露漏洞利用主要是查看敏感信息,会用到的一些指令如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git reflog         																		# 显示所有提交,包括孤立节点
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log -5
git log --stat # 显示提交日志及相关变动文件
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支

除此之外还有很多git指令可以使用,如下是git配置仓库时常用的指令

image.png

漏洞利用实战

Bugku-source

靶场地址:https://ctf.bugku.com/challenges/detail/id/168.html

目录扫描发现存在.git路径,并且路径直接访问可以获取所有文件信息

image.png

通过wget指令递归下载整个.git目录到本地

image.png

然后通过git reflog指令查看所有提交

image.png

然后通过git show逐个查看修改的内容,最终拿到flag

image.png

攻防世界-lottery

靶场地址:https://adworld.xctf.org.cn/challenges/list

一个买彩票小游戏,注册会得到20美元初始资金,每次输入7位数字进行博彩,赢得的奖金数取决于匹配相同数字数量,而要买下flag需要9990000美元

image.png

主目录下有robots.txt文件,里面记录.git路径,由于.git路径无法直接在浏览器访问,这里我们使用GitHacker把.git目录下的所有文件下载下来

image.png

下载下来后查看api.php文件,里面有一个buy函数用于购买彩票

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function buy($req){
require_registered();
require_min_money(2);

$money = $_SESSION['money'];
$numbers = $req['numbers'];
$win_numbers = random_win_nums();
$same_count = 0;
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++;
}
}
switch ($same_count) {
case 2:
$prize = 5;
break;
case 3:
$prize = 20;
break;
case 4:
$prize = 300;
break;
case 5:
$prize = 1800;
break;
case 6:
$prize = 200000;
break;
case 7:
$prize = 5000000;
break;
default:
$prize = 0;
break;
}
$money += $prize - 2;
$_SESSION['money'] = $money;
response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}

由于if($numbers[$i] == $win_numbers[$i])匹配彩票号码是否匹配用的是数组元素弱比较,因此我们只要让数组元素为true便可以绕过比较,通过构造全为true的数组拿到最高奖金刷钱

image.png

刷到一定金额后直接买下flag

image.png




👨‍💻本站由 @鱼龙 使用 Stellar 主题创建

📃本"页面"访问 次 | 👀总访问 次 | 🥷总访客

⏱️本站已运行 小时