git信息泄露漏洞
git信息泄露漏洞
當(dāng)前大量開發(fā)人員使用git進(jìn)行版本控制,對站點(diǎn)自動部署。如果配置不當(dāng),可能會將.git文件夾直接部署到線上環(huán)境。這就引起了git泄露漏洞。
危害
攻擊者可以利用該漏洞下載git文件夾里的所有內(nèi)容。如果文件夾內(nèi)有敏感信息比如站點(diǎn)源碼、數(shù)據(jù)庫賬戶密碼等,攻擊者可能直接控制服務(wù)器。
Git介紹
Git作為大家熟悉的,深受歡迎的版本控制工具,和其他同類工具有很多不同之處:
- Git始終保存快照而不是文件差異。
- 任何數(shù)據(jù)存儲前始終使用SHA-1計算校驗和,保證內(nèi)容完整性。
- 使用分布式倉庫設(shè)計,讓大多數(shù)操作都在本地進(jìn)行,保證了使用效率。幾乎所有操作都是向數(shù)據(jù)庫增加數(shù)據(jù),提交之后就很難丟失數(shù)據(jù)。它的本質(zhì)更像一個內(nèi)容尋址(content-addressable)文件系統(tǒng),并在此之上提供了一個版本控制系統(tǒng)的用戶界面。
Git 有三種狀態(tài),你的文件可能處于其中之一:已修改(modified)、已暫存(staged)、已提交(committed)。由此引出三個邏輯區(qū)域,他們和文件狀態(tài)以及部分對應(yīng)操作的關(guān)系如下圖。
Git對象
在Git系統(tǒng)中有四中類型的對象,所有的Git操作都是基于這四種類型的對象。
- “blob”,這種對象用來保存文件的內(nèi)容。
- “tree”,可以理解成一個對象關(guān)系樹,它管理一些"tree"和“blob”對象。
- “commit”,指向一個"tree",它用來標(biāo)記項目某一個特定時間點(diǎn)的狀態(tài)。它包括以下關(guān)于時間點(diǎn)的元數(shù)據(jù),如時間戳、最近一次提交的作者、指向上次提交、
- “tag”,給某個提交增添一個標(biāo)記。
git對象之間的個關(guān)系如下圖
SHA1哈希值
在Git系統(tǒng)中,每個Git對象都通過哈希值來代表這個對象。哈希值是通過SHA1算法計算出來的,長度為40個字符(40-digit)。
.git目錄
- config - 包含一些配置選項
- description - 倉庫的描述信息,主要給gitweb等git托管系統(tǒng)使用
- HEAD - 指定當(dāng)前分支,映射到ref引用,能夠找到下一次commit的前一次哈希值
- hooks - 存放可在某些指令前后觸發(fā)運(yùn)行的鉤子腳本(hook scripts),默認(rèn)包含一些腳本樣例
- index - 這個文件就是我們前面提到的暫存區(qū)(stage),是一個二進(jìn)制文件
- info - 存放倉庫的信息
- objects - 存儲所有Git的數(shù)據(jù)對象,對象的SHA1哈希值的前兩位是文件夾名稱,后38位作為對象文件名
- refs - 存儲各個分支指向的目標(biāo)提交
- branches - 還沒發(fā)現(xiàn)有什么用處
Git基本操作
對照這張圖來理解兩段提交,工作區(qū)(working tree),暫存區(qū)(stage/index)和 branch之間的關(guān)系
常用命令:
git ls-files -u顯示沖突的文件,-s是顯示標(biāo)記為沖突已解決的文件
git diff 對比工作區(qū)和stage文件的差異
git diff --cached 對比stage和branch之間的差異
git ls-files --stage 檢查保存在stage的文件
git log 顯示到HEAD所指向的commit為止的所有commit記錄 。
git reset HEAD <file>
git reset --hard HEAD放棄工作區(qū)和index的改動,HEAD指針仍然指向當(dāng)前的commit.
實(shí)際操作流程
git init
此命令初始化一個新本地倉庫,它在工作目錄下數(shù)據(jù)目錄生成一個名為.git的隱藏文件夾。git會將所有的文件,目錄,提交等轉(zhuǎn)化為git對象,壓縮存儲在這個文件夾當(dāng)中。
git init 命令后面不加參數(shù)表示把當(dāng)前目錄變?yōu)閭}庫,如下表示在當(dāng)前目錄下創(chuàng)建test倉庫
git add
創(chuàng)建一個test1.txt文件,git status查看當(dāng)前狀態(tài),此時test.txt文件位于工作目錄
通過git add跟蹤這個文件,把test.txt文件放到暫存區(qū).(可以使用git rm --cached命令來取消暫存)
git commit
在暫存區(qū)的文件使用git commit提交到版本庫(數(shù)據(jù)目錄)中
-m參數(shù)表示提交的注釋,如果不使用-m參數(shù)那么會跳出頁面提示主動輸入注釋
修改test.txt文件
修改后,通過查看git status可以看到文件狀態(tài)被改變了。根據(jù)提示知道文件已被修改,但是未提交修改到版本庫中。
git diff,對比工作區(qū)和暫存區(qū)文件的差異,查看文件被修改的地方
確認(rèn)修改無誤后提交到版本庫的方法和提交初始文件一樣,需要先提交到暫存區(qū),然后提交到版本庫.
再修改一次文件
提交
git log 查看下歷史記錄,HEAD我的理解就是指針,指到最后提交的版本
git reset --hard,回退版本
回退到上一個版本,gei reset --hard HEAD^
厲害了,可以看到HEAD指針也指到了第一次修改的版本,第二次修改的版本看不到了
但是我要是因為操作失誤怎么追回地二次修改的版本呢,可以使用git reset --hard 版本號追回
git reflog獲取版本號,得到第二次修改版本號為5edcc89
get reset --hard 5edcc89恢復(fù)
我后面測試使用comit后面一串很長的字符,這里理解為對象sha1字符串吧.也可以回退到那個版本
可以把工作區(qū)修改的文件git add提交到暫存區(qū),也可以使用git checkout — test1.txt 把工作區(qū)的修改撤銷,這樣,文件就會回退到上一次提交時的狀態(tài)。
Git信息泄露原理
- 通過泄露的.git文件夾下的文件,還原重建工程源代碼
- 解析.git/index文件,找到工程中所有的(文件名,文件sha1)
- 去.git/objects文件夾下下載對應(yīng)的文件
- zlib解壓文件,按原始的目錄結(jié)構(gòu)寫入源代碼
(危害:滲透測試人員、攻擊者,可以進(jìn)一步代碼審計,挖掘:文件上傳,sql注入等安全漏洞)
GitHack工具使用
GitHack會按照上面的原理自動恢復(fù)
參考:https://www.zhihu.com/tardis/sogou/art/30044692
總結(jié)
- 上一篇: 渗透测试神器CS(4.0)的使用
- 下一篇: 目录爆破工具 -- dirsearch