目录
Git 源码泄露:
1、strpos() 函数
2、assert()函数
3、file_exists() 函数
4、die() 函数
代码审计:
命令执行漏洞:
打开链接
在About里发现网站是使用Git、PHP、Bootstrap搭建的
使用dirsearch扫一下
从结果可以看出确实存在.git 目录,我们也可以直接访问到
Git 源码泄露:
.git文件是开发人员在开发过程中使用 Git(分布式版本控制系统)做开发时产生的隐藏目录,该文件包含一些版本信息和网站源码,数据库信息等敏感信息。开发人员使用 git 进行版本控制,对站点自动部署。但如果配置不当,可能会将 .git 文件夹直接部署到线上环境,这就引起了 git 泄露漏洞,我们可以通过 .git文件恢复网站源码,来获取一些敏感信息。
我们这里使用Githack来下载并恢复.git文件
GitHack 是一个 .git 泄露利用脚本,通过泄露的 .git 文件夹下的文件可以重建还原工程源代码
首先切换到Githack所在位置
使用命令:python Githack.py url
进入下载文件所在目录查看
打开flag.php,但是并没有看到什么
在index.php里发现有用代码
审计这段代码前我们需要先知道以下知识:
1、strpos() 函数
查找字符串在另一字符串中第一次出现的位置(区分大小写)
eg:
查找 "php" 在字符串中第一次出现的位置:
<?php
echo strpos("I love php, I love php too!","php");
?>
2、assert()函数
检查断言是否为 false
,且会将括号中的字符当成代码来执行,返回true或false,并在结果为 false
时采取适当的行动。
3、file_exists() 函数
检查文件或目录是否存在,如果指定的文件或目录存在则返回 TRUE,否则返回 FALSE。
4、die() 函数
该函数是exit()函数的别名,会输出一条消息,并退出当前脚本。
代码审计:
?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
就是使用get请求方式给page传参,如果没传,默认page=home
(这也是为什么我们打开题目链接进去是在home页面)
继续看后面的代码:
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
$file变量会接收传入的$page并且在其前面拼接templates/,在其后面拼接.php
(PHP中用.来实现字符串的拼接)
比如我们传入?page=flag,那么$file就成了templates/flag.php
strpos() 函数会在'$file'这个字符串中进行查找,是否存在'..'
当字符串里有'..',则会返回一个数(即'..'第一次出现的位置),结果为true
与右边的false并不恒等,此时就会执行or右边的die()函数,输出 Detected hacking attempt!
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
此外,file_exists() 函数还会检查我们传入的page拼接后是否存在
有前面可知,templates下实际存在的只有4个文件
只要我们传入的不是这4个,就会执行die函数,输出 That file doesn't exist!
命令执行漏洞:
实际上这里的file_exists()函数对我们获取flag并不影响
因为assert()函数会将括号中的字符当成代码来执行
我们可以直接在第一个assert()函数处就调用cat命令来获取flag
首先传入的page肯定不能有 '..',使strpos() 函数返回false,false和右边的false恒等
构造payload:?page=123') or system("cat templates/flag.php");//
其实这里的前半段可以是它存在的文件也可以是它不存在的文件(123就算换成flag也不影响)
因为我们前半段返回的是false,我们只要or后面的执行即可
在最后添加注释//,确保后面的代码不会执行
传入page后查看源码,找到flag
cyberpeace{1f150d17210f2080d18800a5a99e9f9b}