Nginx und/oder PHP anweisen, Befehle *nicht* pro Verzeichnis zu interpretieren?

Nginx und/oder PHP anweisen, Befehle *nicht* pro Verzeichnis zu interpretieren?

Ich führe einen Pentest für meine neue Website durch und habe Weevely verwendet, um eine PHP-Nutzlast zu generieren. Ich füge sie manuell direkt in die Bilder ein, wo Benutzer Bilder auf meine Website hochladen können. Ich kann eine umgekehrte Verbindung zur Weevely-Nutzlast herstellen /images. Ist es möglich, Nginx und/oder PHP mitzuteilen,nichtBefehle aus dem Verzeichnis /images zu interpretieren? Gibt es außer der richtigen[1] Codierung eines sicheren Eingabemechanismus mit Dateivalidierungen noch etwas, was wir tun können, um zu verhindern, dass Payloads in bestimmten (/images) Verzeichnissen ausgeführt werden?

[1]https://php.earth/doc/security/uploading

user www-data;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    charset utf-8;
    server_tokens  off;

    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Pragma public;
    add_header Cache-Control "public";

    include /etc/nginx/conf.d/*.conf;

    gzip on;
    gzip_comp_level 2;
    gzip_min_length 1000;

    server {
    listen 127.0.0.1:80;
    server_name website.com;
    root /var/www/website/;
    index index.php index.html;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param HTTP_PROXY "";
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
    }

    location ~* .(png|ico|gif|jpg|jpeg|css|html|txt|php)$ {
        expires 2d;
            add_header Pragma public;
        add_header Cache-Control "public";
    }

    if ($request_method !~ ^(GET|POST)$) {
         return 444;
    }
    }
}

Antwort1

Die Frage ist unklar. Was meinen Sie mit „Befehle interpretieren“? Nginx stellt Dateien bereit und leitet Anfragen per Proxy an andere Server oder Dienste wie PHP weiter. PHP führt Skripte aus.

Ich denke, Sie möchten, dass das Bilderverzeichnis nur Dateien bereitstellt und nicht PHP-Skripte ausführt.

Ich habe meine Caching-Header hinzugefügt. Pragma ist alt, Sie müssen es nicht verwenden.

location \images
   root \whatever;
   add_header Cache-Control "public, max-age=691200, s-maxage=691200";
   more_clear_headers Server; more_clear_headers "Pragma"; more_clear_headers "Expires";
}

Alternativ können Sie so etwas wie die Antwort aufdiese Frage:

location ~ /images/(.+)\.php$ {
  deny all;
}
location ~ \.php$ {
  // as above
}

verwandte Informationen