N1CTF 2021 WP


signin

源码

<?php 
//flag is /flag
$path=$_POST['path'];
$time=(isset($_GET['time'])) ? urldecode(date(file_get_contents('php://input'))) : date("Y/m/d H:i:s");
$name="/var/www/tmp/".time().rand().'.txt';
$black="f|ht|ba|z|ro|;|,|=|c|g|da|_";
$blist=explode("|",$black);
foreach($blist as $b){
    if(strpos($path,$b) !== false){
        die('111');
    }
}
if(file_put_contents($name, $time)){
	echo "
logpath:$name
"; } $check=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($path)); if(is_file($check)){ echo "
".file_get_contents($check)."
"; }

我们有一个提示说标志位于路径“/flag”。我们有一个“path”变量,它从 POST 请求中获取输入,我们有一个“time”变量,只有当 GET 请求中的时间变量被设置时,它才会从原始 POST 数据中获取输入。所以我们在两个地方控制输入。
POST 变量“路径”有一个黑名单。这意味着我们不能将 'path' 设置为 '/flag'。让我们看看另一个输入变量“时间”。它将请求的原始 POST 数据作为输入并将其保存在文件中。该文件名返回给用户。

如果 'path' 变量不为空,则将其传递给黑名单过滤器,将 'path' 指定的文件内容通过正则表达式,最后将过滤后的数据假定为文件路径。我们读取该文件并将内容发送给用户。

所以解决方案是我们将 '/\f\l\a\g' 作为原始 POST 数据发送到 'time' 变量。反斜杠阻止日期函数将输入解析为日期。它将被保存为一个文件,该文件位置将返回给我们。我们获取该文件位置并将其传递给 POST 请求中的“路径”变量。 '/flag' 的内容返回给我们。

flag:n1ctf{bypass_date_1s_s000_eassssy}

wp