前言
本题来源于攻防世界WEB题,题目名称为mfw,考察的是PHP代码注入,需要有点脑洞,故记录一下。
正文
首先打开网站后浏览页面,可看到提示用到Git、PHP、Bootstrap,自然想到.git源码泄露:
查看一下果然存在:
那么使用GitHack工具下载源码
下载后所有代码如下:
很明显flag在flag.php文件中,但是泄露的源码中未写入,所以需要根据index.php的漏洞读取到flag.php文件,因为其它的三个都是静态文件。
因为代码中有assert执行判断,而$file可控,所以可以调整$file值进行代码注入,源代码如下:
1 | if (isset($_GET['page'])) { |
构造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: