3 votes

Le serveur est-il toujours vulnérable aux attaques si nous ne désactivons pas cgi.fix_pathinfo ?

El /etc/nginx/sites-available/default qui est fourni avec l'installation de nginx a le contenu suivant :

# You may add here your
# server {
#   ...
# }
# statements for each of your virtual hosts to this file

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

    # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
    #location /RequestDenied {
    #   proxy_pass http://127.0.0.1:8080;    
    #}

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    #   root /usr/share/nginx/html;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #   fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #
    #   # With php5-cgi alone:
    #   fastcgi_pass 127.0.0.1:9000;
    #   # With php5-fpm:
    #   fastcgi_pass unix:/var/run/php5-fpm.sock;
    #   fastcgi_index index.php;
    #   include fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#   listen 8000;
#   listen somename:8080;
#   server_name somename alias another.alias;
#   root html;
#   index index.html index.htm;
#
#   location / {
#       try_files $uri $uri/ =404;
#   }
#}

# HTTPS server
#
#server {
#   listen 443;
#   server_name localhost;
#
#   root html;
#   index index.html index.htm;
#
#   ssl on;
#   ssl_certificate cert.pem;
#   ssl_certificate_key cert.key;
#
#   ssl_session_timeout 5m;
#
#   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
#   ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
#   ssl_prefer_server_ciphers on;
#
#   location / {
#       try_files $uri $uri/ =404;
#   }
#}

Vous pouvez voir qu'il y a une note "Vous devriez avoir "cgi.fix_pathinfo = 0 ; dans php.ini". Au-dessus, nous avons aussi cette ligne :

fastcgi_split_path_info ^(.+\.php)(/.+)$;

Selon l'article Problème de sécurité sur Nginx, PHP et fastcgi_split_path_info nous pouvons atténuer les vulnérabilité de l'information sur le chemin en éteignant cgi.fix_pathinfo ou en faisant usage de la fastcgi_split_path_info .

Puisqu'il utilise déjà le fastcgi_split_path_info pour contrer une telle vulnérabilité, pourquoi dit-on toujours qu'il faut éteindre le cgi.fix_pathinfo ? Si nous ne le faisons pas, notre serveur sera-t-il vulnérable aux attaques ?

4voto

Rohit Points 190

Le wiki de Nginx page sur PHP-FPM recommande de tourner cgi.fix_pathinfo sur. Faites attention à la regex utilisée :

fastcgi_split_path_info ^(.+?\.php)(/.*)$;

La page propose également un test au cours duquel vous accédez à différentes URL énumérées ci-dessous et vérifiez les valeurs correctes de REQUEST_URI, SCRIPT_NAME, PATH_INFO et PHP_SELF.

/test.php
/test.php/
/test.php/foo
/test.php/foo/bar.php
/test.php/foo/bar.php?v=1 

test.php ne contient que <?php var_export($_SERVER)?> . Cela permet de déterminer si votre installation est sûre. Sur toutes les URLs, votre SCRIPT_NAME doit être test.php . Dans tous les cas, vous ne devriez pas voir bar.php là.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X