RCTF_R-CURSIVE

这次的rctf没怎么看,傍晚开始看 r-cursive 这题,源码特别简单:
index.php

这里主要有正则,preg_replace('/[^\W_]+((?R)?)/', NULL, $_GET['cmd']),\w 就很烦人了,所以首先要做的就是过这个正则达到任意执行。通过构造cmd=eval(next(getallheaders()));在请求头里插入可执行代码来达到任意执行(这里不止next可以用,主要就是决定你构造代码放在header的什么位置,还有implode,end.....都可以用)我用的是next就是,执行代码插在user_agent中:
RCTF_R-CURSIVE_第1张图片
Test

那么接下来也就是要列出目录,找到flag文件了,这里卡了好久,主要要做的就是绕过openbase_dir的限制,把出了/tmp目录和index.php所在目录除外的其他目录给列出来
RCTF_R-CURSIVE_第2张图片
openbase_dir限制

最后通过opendir + glob://协议列出目录:if($dh=opendir("glob:///var*/www*/sandbox*/*")){while(($file=readdir($dh))!==false){echo"$file\n";}closedir($dh);} 一波谜一样的操作
RCTF_R-CURSIVE_第3张图片
列出目录

发现众多token文件夹后面夹生这init.php和php.ini,猜测flag应该是放在init.php里了,但是我们的权限是在 78854209fa4889d51dd0016ceab319f852d90ec9 文件夹下面的,因为vhost_alias的配置的原因,所以我们默认进入网站的时候是在token目录下的,因为openbase_dir的限制,直接读取init.php文件是读不到的

RCTF_R-CURSIVE_第4张图片
读取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文件
RCTF_R-CURSIVE_第5张图片
init.php
这样也就跨出限制,成功读取到flag。

比赛滑水,也就只看了这道题,其他的题看都没看,不过这次比赛题目质量真心好,有时间都可以做做,仅写来供自己学习记录用。

你可能感兴趣的:(RCTF_R-CURSIVE)