許多工程師在撰寫程式時,會使用 Git 來做版本控管,在使用 Git 的時候,目錄底下會產生一個 .git 的隱藏檔案,裡面就是 git repository,會儲存程式的修改、新增、刪除等紀錄。
若工程師直接將含有 .git 目錄的專案放到網頁伺服器的公開目錄,駭客便有可能下載 .git 中的資料,利用 git 的機制將原始碼重建。
因此當工程師開發完成時,可能有兩個方法發佈較為妥當:
額外將網頁程式碼製作一個副本 (不含 .git),再發佈到網頁伺服器。
直接將含 git 目錄的專案放到網頁伺服器,但同時做好網頁的權限控管,也就是當你瀏覽 /.git 底下的全部內容時,會回傳 403。
假如工程師在測試登入功能時,將 admin 的帳密紀錄在程式的註解中,並使用 git 紀錄到歷史版本中,當工程師不小心上傳 .git,並且沒有做權限控管,那麼駭客就能從洩漏的 .git 目錄中拿到帳密。
此外,因為 .git 洩漏是已知且普遍的問題,有眾多工具可以協助駭客下載 .git 目錄並重建原始碼,只要網頁不小心將 .git 上傳,那就有許多人可以將網頁的 .git 下載下來,反倒甚至出現針對這種工具漏洞的攻擊:
攻擊者會構建惡意的 .git 目錄,故意將其中的一些資料路徑修改,例如將文件路徑加上很多 ../../../ ,一旦重建工具沒有檢查路徑,重構資料就可以隨意覆蓋到你的正常檔案。
一般來說,只要網址/.git 可以看到東西,基本上就能將程式還原,但是有時候網址輸入 /.git 會出現 403 (「無權」訪問指定的URL而非 「檔案不存在」,代表 .git 目錄可能是存在的,你可以嘗試 /.git/config,看他有沒有擋),或是用其他方式拿到 .git 的資料,例如下載
網址/.git/logs/HEAD 儲存 git 的 log,可以找到歷史 commit
網址/.git/refs/heads/master 會記錄 master 的 commit hash,可以分解出該 commit 的資料
網址/.git/refs/heads 底下會放所有分支的名字資料夾
網址/.git/refs/stash 用於暫時保存 git 工作進度,可以把做到一半的東西先藏起來(stash),不要 commit 出去
git stash list 顯示 stash 內的所有內容
git stash pop 把剛剛做到一半存在 stash 的資料還原
網址/.git/info/packs packs 的件提取與恢復 (比較少考)
網址/.git/index 會儲存 git add 的資料
<Directory "C:/xampp/htdocs">
Options Includes FollowSymLinks ExecCGI
AllowOverride All
Require all granted
Header set Access-Control-Allow-Origin *
RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)
</Directory>
<DirectoryMatch "^/.*/\.git/">
Order allow,deny
Require all denied
</DirectoryMatch>
沒有留言:
張貼留言