git信息泄露漏洞
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
總結
- 上一篇: 渗透测试神器CS(4.0)的使用
- 下一篇: 目录爆破工具 -- dirsearch