git源码泄露

Git的简介

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。是为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git具有以下特点:

  1. 开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。(也是分布式相比于集中式的最大区别)
  2. 公共服务器压力和数据量都不会太大。
  3. 速度快、灵活。
  4. 任意两个开发者之间可以很容易的解决冲突。
  5. 离线工作。
  6. 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

漏洞产生的原因

一些开发人员在开发时为了让版本控制和网站部署变得方便,会先将仓库托管在Coding或者Github上,开发好后,直接将源码打包上传进行解压。

可是由于在目录中初始化一个仓库后,会在这个目录下产生一个名叫.git的文件夹,这个文件夹里保存了这个仓库的所有版本信息。如果开发者没有将这个文件夹删除,则会造成源码泄露,攻击者可以利用这个文件还原重建工程代码,进一步进行代码审计,挖掘文件上传、sql注入等漏洞。

同时,如果网站涉及到数据库操作,则可能导致链接数据库需要的用户名、密码、端口、库名等信息从源码中泄露,一旦服务器开放了数据库的远程连接功能,攻击者就可以使用从源码中得到的用户名密码进行登录,造成更多安全隐患。

附:.git文件夹详解及git仓库下两个文件

  1. README.md :对code source的介绍,相当于注释作用,通常涵盖项目介绍、代码所实现的功能、系统环境参数、部署要素、代码组织架构等内容
  2. .gitignore :配置 git 需要忽略的文件或文件夹,从这个文件一般也可以得到一部分网站的目录结构 , 或者一些日志/配置文件等敏感文件

git漏洞的利用

使用GitHack工具

下载地址 https://github.com/lijiejie/GitHack

GitHack是一个.git泄露利用脚本,只需要下载到本地,cd到所在文件夹,执行

1
python githack.py http://xxx.x.x.x/.git

命令

这里我们用Jarvis oj的一道题做演示,题目地址http://web.jarvisoj.com:32798/
1
运行结束后得到文件
2

爬虫爬取整个git目录

这种方法跟使用githack工具相比,好处在于可以完全模拟服务器上的代码环境,跟踪到git的每一次提交,得到git提交日志中可能存在的开发人员对每一次commit的描述,例如对某个bug的修复,进而进行白盒审计。

操作过程

  1. 在linux下利用wget对该目录进行递归下载
1
2
3
4
5
wget -r -p -np -k http://www.xxx.com/.git/
--recursive(递归)
-k, --convert-links(转换链接)
-p, --page-requisites(页面必需元素)
-np, --no-parent(不追溯至父级)
  1. 下载完成后,进入下载的目录
    3.执行命令git log,查看网站的提交记录
    4.执行命令gir reset –hard [log hash],恢复到指定版本号,只需要源码的话就恢复到最近一次的提交

解决办法

  1. 对.git目录的访问权限进行控制
  2. 在每次pull之后删除.git文件夹

参考链接:https://www.jianshu.com/p/edae09535ea3