git信息泄露漏洞
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
危害
攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据库账户密码等,攻击者可能直接控制服务器。
Git介绍
Git作为大家熟悉的,深受欢迎的版本控制工具,和其他同类工具有很多不同之处:
- Git始终保存快照而不是文件差异。
- 任何数据存储前始终使用SHA-1计算校验和,保证内容完整性。
- 使用分布式仓库设计,让大多数操作都在本地进行,保证了使用效率。几乎所有操作都是向数据库增加数据,提交之后就很难丢失数据。它的本质更像一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。
Git 有三种状态,你的文件可能处于其中之一:已修改(modified)、已暂存(staged)、已提交(committed)。由此引出三个逻辑区域,他们和文件状态以及部分对应操作的关系如下图。
Git对象
在Git系统中有四中类型的对象,所有的Git操作都是基于这四种类型的对象。
- “blob”,这种对象用来保存文件的内容。
- “tree”,可以理解成一个对象关系树,它管理一些"tree"和“blob”对象。
- “commit”,指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括以下关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交、
- “tag”,给某个提交增添一个标记。
git对象之间的个关系如下图
SHA1哈希值
在Git系统中,每个Git对象都通过哈希值来代表这个对象。哈希值是通过SHA1算法计算出来的,长度为40个字符(40-digit)。
.git目录
- config - 包含一些配置选项
- description - 仓库的描述信息,主要给gitweb等git托管系统使用
- HEAD - 指定当前分支,映射到ref引用,能够找到下一次commit的前一次哈希值
- hooks - 存放可在某些指令前后触发运行的钩子脚本(hook scripts),默认包含一些脚本样例
- index - 这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
- info - 存放仓库的信息
- objects - 存储所有Git的数据对象,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
- refs - 存储各个分支指向的目标提交
- branches - 还没发现有什么用处
Git基本操作
对照这张图来理解两段提交,工作区(working tree),暂存区(stage/index)和 branch之间的关系
常用命令:
git ls-files -u
显示冲突的文件,-s
是显示标记为冲突已解决的文件
git diff
对比工作区和stage文件的差异
git diff --cached
对比stage和branch之间的差异
git ls-files --stage
检查保存在stage的文件
git log
显示到HEAD所指向的commit为止的所有commit记录 。
git reset HEAD <file>
git reset --hard HEAD
放弃工作区和index的改动,HEAD指针仍然指向当前的commit.
实际操作流程
git init
此命令初始化一个新本地仓库,它在工作目录下数据目录生成一个名为.git的隐藏文件夹。git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
git init 命令后面不加参数表示把当前目录变为仓库,如下表示在当前目录下创建test仓库
git add
创建一个test1.txt文件,git status
查看当前状态,此时test.txt文件位于工作目录
通过git add跟踪这个文件,把test.txt文件放到暂存区
.(可以使用git rm --cached
命令来取消暂存)
git commit
在暂存区的文件使用git commit提交到版本库(数据目录
)中
-m参数表示提交的注释,如果不使用-m参数那么会跳出页面提示主动输入注释
修改test.txt文件
修改后,通过查看git status可以看到文件状态被改变了。根据提示知道文件已被修改,但是未提交修改到版本库中。
git diff
,对比工作区和暂存区文件的差异,查看文件被修改的地方
确认修改无误后提交到版本库的方法和提交初始文件一样,需要先提交到暂存区,然后提交到版本库.
再修改一次文件
提交
git log
查看下历史记录,HEAD我的理解就是指针,指到最后提交的版本
git reset --hard
,回退版本
回退到上一个版本,gei reset --hard HEAD^
厉害了,可以看到HEAD指针也指到了第一次修改的版本,第二次修改的版本看不到了
但是我要是因为操作失误怎么追回地二次修改的版本呢,可以使用git reset --hard 版本号
追回
git reflog
获取版本号,得到第二次修改版本号为5edcc89
get reset --hard 5edcc89
恢复
我后面测试使用comit后面一串很长的字符,这里理解为对象sha1字符串吧.也可以回退到那个版本
可以把工作区修改的文件git add提交到暂存区,也可以使用git checkout — test1.txt 把工作区的修改撤销,这样,文件就会回退到上一次提交时的状态。
Git信息泄露原理
- 通过泄露的
.git
文件夹下的文件,还原重建工程源代码 - 解析
.git/index
文件,找到工程中所有的(文件名,文件sha1) - 去
.git/objects
文件夹下下载对应的文件 zlib
解压文件,按原始的目录结构写入源代码
(危害:渗透测试人员、攻击者,可以进一步代码审计,挖掘:文件上传,sql注入等安全漏洞)
GitHack工具使用
GitHack会按照上面的原理自动恢复
参考:https://www.zhihu.com/tardis/sogou/art/30044692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358754.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!