先分析一下nginx.conf,也是一个一个查的来好好的学一波。
listen:监听设置。
server_name:设置虚拟主机的名称,域名,可以通配符、正则。
如果当一个名称匹配多个 server 的是时候,匹配优先级如下:
- 确切的名称
- 以 * 开头的最长的通配符名称
- 以 * 结尾的最长通配符名称
- 第一个匹配的正则表达式
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
"; } ?>欢迎分享,转载请注明来源:内存溢出
评论列表(0条)