** 简要介绍git **
** 简要介绍git的目录结构 **
在一个目录中初始化一个仓库以后 , 会在这个目录下产生一个名叫 .git
的隐藏文件夹
这个文件夹里面保存了这个仓库的所有版本等一系列信息
后记 : (一般来说 , 一个git仓库还有存在这两个文件 : )
- README.md (项目介绍)
- .gitignore (配置在git进行文件跟踪的时候忽略掉哪些文件 , 从这个文件一般也可以得到一部分网站的目录结构 , 或者一些日志/配置文件等敏感文件)
** 简要介绍利用git的开发模式 **
一般情况下 , 开发人员为了让版本控制和网站部署比较方便 , 在开发的时候就会走这样的流程
- 初始化仓库 , 并将仓库托管在Coding或者Github上 , 便于远程协作/备份/部署
- 在本地进行网站开发 , 并定时提交commit , 并push到远程托管网站
- 当一个阶段的开发差不多的时候 , 需要远程登陆服务器 , 通过托管网站再将发行版网站pull到Web目录下
- 网站正常运行
这里当网站维护(开发)人员在从托管网站pull代码的时候 , 也会将这个储存了所有的版本信息的
.git
文件夹下载到服务器的Web目录下 , 这样的话 , 攻击者就可以利用这个目录 , 去下载git文件夹 , 就可以利用其中储存的版本控制信息 , 完全恢复网站后台的代码和目录结构 , 当然 , 一般网站都会涉及到数据库操作 , 而一般来说 , 需要链接数据库就需要用户名/密码/端口/库名等信息 , 而这些信息肯定会在网站后台的源码里面又体现 , 因此这种情况是极其危险的 , 还有 , 一旦服务器开放了数据库的远程连接功能 , 攻击者就可以利用从源码中找到的数据库用户名和密码对远程数据库进行登陆 , 危险性不言而喻
** 如何去利用 ? **
- GitHack (一个开源的Git源码泄漏的利用工具)
- 爬虫爬取整个git目录 (这个方法比较原始 , 需要具有一定的Git经验 , 这里重点介绍这种方法 , 但是这种方法和使用githack这个工具相比 , 有一个比较好的地方就是 , 可以完全模拟服务器上的代码环境 , 可以跟踪到git的每一次提交 , 但是githack好像只可以将源码恢复到最近的一次提交 , 这里的好处还有可以去查看git的提交日志 , 这个日志信息中会有开发人员对每一次commit的描述 , 比如某个BUG的修复等等 , 对于这些和BUG相关的地方 , 可以有针对性地进行白盒审计 , 有可能这个BUG修复了还不如没修复 , 可能会造成更大的漏洞)
** 具体利用思路 : **
- 利用爬虫递归下载.git目录的所有文件
- 利用git命令对网站的commit历史进行查看
- 利用git命令对网站的源码进行恢复
** 具体操作 : **
演示网站 : http://www.xxx.com/.git/
- 在ubuntu下利用wget对该目录进行递归下载 (参考文章)
wget -r -p -np -k http://www.xxx.com/.git/
--recursive(递归)
-k, --convert-links(转换链接)
-p, --page-requisites(页面必需元素)
-np, --no-parent(不追溯至父级)
- 下载完成后 , 进入下载的网站目录
- 利用命令 :
git log
查看网站的提交记录 - 利用命令 :
git reset --hard [log hash]
恢复到指定版本号 (一般如果只需要得到源码的话就恢复到最近的一次提交)
** 如何修复 **
- 对.git目录的访问权限进行控制
- 在每次pull之后删除.git文件夹