RCTF2021 EasyPHP

RCTF2021 EasyPHP,第1张

RCTF2021 EasyPHP EasyPHP

先分析一下nginx.conf,也是一个一个查的来好好的学一波。

listen:监听设置。

server_name:设置虚拟主机的名称,域名,可以通配符、正则。

如果当一个名称匹配多个 server 的是时候,匹配优先级如下:

  1. 确切的名称
  2. 以 * 开头的最长的通配符名称
  3. 以 * 结尾的最长通配符名称
  4. 第一个匹配的正则表达式

location:根据 URI 进行配置设置。

location [ = | ~ | ~* | ^~ ] uri { ... }
  • none,如果没有修饰符,则将该位置解释为前缀匹配。这意味着给定的位置将根据请求URI的开头进行匹配,以确定匹配
  • =,代表精确匹配,完全相等即匹配
  • ~,区分大小写的正则表达式匹配
  • ~*,不区分大小写的正则表达式匹配
  • ^~,普通字符匹配,如果该选项匹配,只匹配该选项

所以本题中的都是None,即为前缀匹配,Z3ratu1师傅就是利用了这个前缀匹配的漏洞对/admin进行了绕过。

allow和deny:指令是由ngx_http_access_module模块提供,用于访问控制,用于ip控制。本题里面肯定就是匹配/admin前缀的只允许ip为127.0.0.1的访问。

try_files:其作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。

在这里其实就是,先检查$document_root$uri是否存在,如果不存在就内部重定向到@phpfpm:

    location @phpfpm {
        include        fastcgi_params;
        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  script_FILENAME  $document_root/index.php;
        fastcgi_param  REQUEST_URI  $uri;
    }

它最上面设置了root /var/www/html;,而$url就是请求那部分了,比如请求/admin?hello=world,那么nginx这里的$url是/admin。

所以这里很明显是被转交给@phpfpm处理。

fastcgi_pass:address为后端的fastcgi server的地址。

fastcgi_index:fastcgi默认的主页资源。

fastcgi_param:传递给FastCGI服务器的参数值,可以是文本,变量或组合。

需要注意到这个REQUEST_URI是$uri,这个就比较重要了,后面会利用到。

接下来开始本题的解题。

看一下index.php里面的路由,各种 *** 作:

$value){
            if(isdanger($k)||isdanger($value)){
                return true;
            }
        }
    }else{
        if(strpos($v,"../")!==false){
            return true;
        }
    }
    return false;
}

$app->before("start",function(){
    foreach([$_GET,$_POST,$_cookie,$_FILES] as $value){
        if(isdanger($value)){
            die("go away hack");
        }
    }
});
$app->route('/*', function(){
    global $app;
    $request = $app->request();
    $app->render("head",[],"head_content");
    if(stristr($request->url,"login")!==FALSE){
        return true;
    }else{
        if($_SESSION["user"]){
            return true;
        }
        $app->redirect("/login");
    }

    
});


$app->route('/admin', function(){
    global $app;
    $request = $app->request();
    $app->render("admin",["data"=>"./".$request->query->data],"body_content");
    $app->render("template",[]);
});

$app->route("GET /login",function(){
    global $app;
    $request = $app->request();
    $app->render("login",["fail"=>$request->query->fail],"body_content");
    $app->render("template",[]);
});

$app->route("POST /login",function(){
    global $username,$password,$app;
    $request  = $app->request();
    if($request->data->username === $username && $request->data->password === $password){
        $_SESSION["user"] = $username;
        $app->redirect("/");
        return;
    }
    $app->redirect("/login?fail=1");
});

$app->route("GET /",function(){
    global $app;
    $app->render("index",[],"body_content");
    $app->render("template",[]);
});

$app->start();

在admin视图里面发现了任意文件读取:

File List:


    $v
"; } ?>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5351140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-09
下一篇 2022-12-09

发表评论

登录后才能评论

评论列表(0条)

保存