Bloquear PHP en uploads

En principio, cuando subes ficheros mediante el panel de Multimedia sólo se permiten elementos como imágenes, ficheros de texto y similares, pero no se permiten ficheros PHP (el lenguaje de programación con el que se hace WordPress) entre otros. Si esto estuviera activo, podría permitir que un hacker pueda ejecutar procesos maliciosos que no se deben ejecutar. Para ello deberíamos bloquear la posibilidad de ejecutar ficheros PHP en esta carpeta.

En Apache HTTPD (dentro del fichero .htaccess en la carpeta [/wp-content/uploads/]):

<Files ~ ".+\.php">
  Deny from all
</Files>

Si queremos ser más agresivos, podemos bloquear muchos más lugares donde no es necesario que el público tenga que acceder, y que el núcleo de WordPress sí:

En nginx (dentro del fichero de configuración del sitio):

location ~* /wp-includes/.*\.php$ {
  deny all;
  access_log off;
  log_not_found off;
}
location ~* /wp-content/.*\.php$ {
  deny all;
  access_log off;
  log_not_found off;
}
location ~* /(?:uploads|files)/.*\.php$ {
  deny all;
  access_log off;
  log_not_found off;
}

¿Qué carpetas habría que bloquear?

Aunque en principio la única carpeta que no debería tener acceso a ejecutar ficheros PHP es la de subida de multimedias, se puede hacer extensiva a otras partes de código. En estos casos hay que vigilar los plugins y plantillas que tengan ciertos requerimientos (aunque harían un mal uso de la idea original de WordPress).

  • /wp-content/uploads/: Es la carpeta donde los usuarios suben contenidos; el menú de subida de multimedia de WordPress por defecto no deja subir PHP, pero en muchas ocasiones hay agujeros de seguridad que dejan incluir contenidos aquí. Evitando la ejecución de cualquier lenguaje de programación de servidor (PHP, Python, Perl…) evitaremos que nos puedan incluir algún tipo de Web-Shell.
  • /wp-includes/: Esta carpeta en principio sólo incluye elementos “include” del sistema. Suelen ser ficheros CSS y JavaScript, aunque en algunos casos también son PHP. Pero estos ficheros PHP no son llamados por el usuario sino por el sistema mediante las funciones include() por lo que no tienen porqué ser accesibles desde el navegador.

Deja un comentario