Endurecimiento de PHP para WordPress

Publicado: 2021-06-29

WordPress se ejecuta en PHP y es un componente central al que se debe prestar atención al fortalecer su sitio de WordPress. Este artículo cubrirá algunas de las frutas más comunes y asequibles que puede abordar en lo que respecta a la seguridad de PHP para WordPress.

Atención : tenga cuidado al realizar cambios en la configuración de PHP. Una configuración y sintaxis incorrectas pueden dañar su sitio web. Siempre pruebe sus cambios en un entorno de desarrollo o ensayo antes de realizar cambios en producción.

Tabla de contenido

  • Usa la última versión de PHP
  • Suprimir la versión de PHP
  • Eliminar cualquier archivo phpinfo()
  • Suprimir errores y advertencias de PHP
  • Restringir incluye
  • Deshabilitar el archivo remoto incluye
  • Deshabilitar o limitar funciones peligrosas
  • Bloquear la ejecución de PHP en directorios confidenciales
  • Conclusión

Usa la última versión de PHP

Además de asegurarse de que está parcheando su sistema operativo, servidor MySQL, servidor web (por ejemplo, Nginx, Apache, IIS...), también es absolutamente crucial asegurarse de que está ejecutando una versión totalmente compatible de PHP 1. .

Dado que PHP está expuesto a Internet (porque WordPress se ejecuta sobre el intérprete de PHP), existe un mayor riesgo de ataque en caso de que se descubra un exploit para una vulnerabilidad dentro de PHP. Hasta tal punto, mantener PHP actualizado (y más aún, para mantenerse alejado de las versiones PHP 5.x al final de su vida útil) es crucial no solo para evitar que ocurran ataques, sino también para permitir que los atacantes intensifiquen los ataques si se las arreglan para afianzarse en su sitio web de WordPress (por ejemplo, explotando una vulnerabilidad en un complemento de WordPress).

Suprimir la versión de PHP

Como la mayoría del software de servidor web, de forma predeterminada, PHP expone la versión que se está ejecutando a través de un encabezado HTTP X-Powered-By. Si bien esto en sí mismo no es una vulnerabilidad de seguridad, como en cualquier otra situación, la enumeración de versiones de software generalmente es útil para los atacantes durante la fase de reconocimiento de un ataque. Por lo tanto, al deshabilitar la versión de PHP, estaría haciendo un ataque un poco más difícil de tener éxito.

Afortunadamente, esto es fácil de deshabilitar usando la configuración de exposición_php. En su archivo de configuración php.ini , simplemente agregue lo siguiente.

expose_php = Off

Eliminar cualquier archivo phpinfo()

Crear un archivo PHP usando la función phpinfo() para usar en la depuración es un mal hábito común que tienen muchos administradores de sistemas PHP. Si un atacante encuentra un archivo 'phpinfo' (generalmente, como era de esperar, llamado phpinfo.php), se le proporciona una gran cantidad de información y detalles no solo sobre la versión de PHP que se ejecuta en el servidor, sino también sobre otros aspectos del sitio web, como como servidor web y de base de datos.

Si realmente necesita ejecutar phpinfo(), es mucho más preferible hacerlo desde la línea de comandos, de la siguiente manera.

php -i

Si tiene más de una configuración de PHP en su sistema (muy común), puede usar el siguiente comando para especificar qué archivo php.ini usar.

php -c /etc/php/apache2/php.ini -i

Suprimir errores y advertencias de PHP

Si bien los errores, las advertencias y las excepciones son útiles durante el desarrollo, si se muestran en un entorno público, los atacantes suelen usar esta información para obtener información sobre la configuración del servidor, el diseño de la aplicación y los componentes.

Los mensajes de error son algunas de las rutas más comunes para la divulgación de información, a menudo filtrando información como la ruta de instalación de la aplicación y los detalles de conectividad de la base de datos. En lugar de mostrar errores y advertencias, asegúrese de que se registre esta información. Se puede encontrar más información sobre este tema en la documentación oficial de PHP.

Afortunadamente, esto es fácil de desactivar usando la configuración display_errors. En su archivo de configuración php.ini, simplemente agregue lo siguiente.

display_errors = Off
log_errors = On

Restringir incluye

Las vulnerabilidades de inclusión de archivos permiten que un atacante controle una instrucción PHP include(). Si bien PHP ejecutará cualquier código PHP dentro de un archivo que se incluya, imprimirá cualquier otra cosa (suponiendo que sea texto sin formato). Esto significa que un atacante que tome el control de una vulnerabilidad de inclusión de archivos puede terminar ejecutando algo similar a lo siguiente, dándole acceso a archivos confidenciales del sistema. Para leer más sobre la inclusión de archivos, echa un vistazo a este artículo.

include "../../../../etc/passwd"

Al establecer la configuración open_basedir en php.ini, puede indicarle a PHP que solo permita inclusiones dentro de un directorio determinado y por debajo. Si bien esto no elimina las vulnerabilidades de inclusión de archivos, sin duda las hace más restringidas y también evita algunos ataques más avanzados que pueden conducir a la ejecución de código (cuando un atacante puede ejecutar comandos en su servidor).

Puede establecer la configuración de PHP open_basedir de la siguiente manera en su archivo php.ini.

open_basedir = /var/www/html/example.com

Deshabilitar el archivo remoto incluye

Además de restringir las inclusiones locales a un directorio específico mediante open_basedir, también es recomendable deshabilitar las inclusiones remotas. Los ataques de inclusión de archivos remotos (RFI) funcionan de manera similar a los ataques de inclusión de archivos locales, pero en lugar de que un atacante esté vinculado a archivos en el sistema, la inclusión de archivos remotos permite que un atacante incluya archivos en la red. Esto es extremadamente peligroso, y la mayoría de los ataques RFI terminan cuando un atacante puede ejecutar código arbitrariamente en su servidor web (lo que se conoce como ejecución remota de código o RCE).

Para deshabilitar las inclusiones remotas de archivos, use las opciones de PHP allow_url_fopen y allow_url_include en su archivo php.ini de la siguiente manera.

allow_url_fopen = Off
allow_url_include = Off

Deshabilitar o limitar funciones peligrosas

En el caso de que un atacante, a pesar de todas tus medidas de seguridad, consiga encontrar una vulnerabilidad en la seguridad de PHP de tu WordPress, que pueda explotar, lo último que quieres es que pueda ejecutar código arbitrario en tu servidor. . Si un atacante es capaz de ejecutar código arbitrario en su servidor, es probable que pueda instalar un webshell o establecer un shell inverso para controlar aún más su servidor y usarlo para hacer sus ofertas nefastas (como propagar malware, usar su sitio web para campañas de phishing o negar de ataques al servicio, o incluso minería de criptomonedas).

Al deshabilitar funciones como shell_exec() y system(), puede evitar que usuarios y atacantes hagan uso de estas peligrosas funciones. Si bien puede haber razones legítimas para hacer uso de estas funciones, son muy pocas y distantes entre sí, y generalmente hay una forma más segura de lograr el mismo resultado.

Aviso : pruebe lo siguiente a fondo en un entorno de prueba o ensayo antes de ejecutarlo en producción, ya que algunos software/complementos que está ejecutando pueden (con suerte legítimamente) depender de estas funciones.

La siguiente es una colección de funciones potencialmente peligrosas que quizás desee deshabilitar en PHP usando la configuración disabled_functions en su archivo php.ini.

disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace,
tmpfile, link, ignore_user_abord, shell_exec, dl, exec, system, highlight_file, source,
show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid,
posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid,
posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, 
posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, 
posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, 
proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo</em>

Bloquear la ejecución de PHP en directorios confidenciales

De forma predeterminada, su directorio wp-content/uploads , que se utiliza para cargar temas, complementos, imágenes, videos y otros archivos en su sitio web, puede ejecutar código PHP. Esto es bastante arriesgado: si un atacante de alguna manera puede aprovechar una vulnerabilidad de carga de archivos en un complemento o un tema, es posible que pueda cargar un webshell o un tipo similar de puerta trasera. Dado que la ejecución de PHP se permitiría dentro del directorio wp-content/uploads , ese atacante podría ejecutar ese código PHP para cumplir sus órdenes maliciosas.

Prevenir esto es bastante simple: deshabilite la ejecución de PHP dentro de wp-content/uploads y el directorio. La forma ingenua sería simplemente bloquear el acceso a los archivos *.php usando .htaccess .

<Files *.php>
deny from all
</Files>

Sin embargo, la configuración anterior es relativamente fácil de eludir: en la mayoría de los casos, PHP ejecutará gustosamente archivos .phtml .php3. La forma más segura sería deshabilitar literalmente el motor PHP dentro del directorio. La siguiente configuración de .htaccess debe colocarse dentro del directorio wp-content/uploads y wp-includes (otro directorio comúnmente atacado por los atacantes).

php_flag engine off

Seguridad PHP para WordPress – reflexiones finales

Si bien WordPress en sí debe considerarse una plataforma robusta y segura, el entorno y la infraestructura en los que se ejecuta su instalación de WordPress contribuyen en gran medida a garantizar la seguridad de su sitio web en su conjunto. La implementación de los temas tratados en esta guía de fortalecimiento de la seguridad de PHP le proporcionará una segunda línea de defensa, lo que hará que sea significativamente más difícil para un atacante escalar un ataque después de abusar de una vulnerabilidad dentro de su sitio web de WordPress.

Si desea obtener más información sobre cómo fortalecer su sitio de WordPress, lea nuestra guía definitiva sobre seguridad y fortalecimiento de WordPress.

Referencias utilizadas en este artículo [ + ]

Referencias utilizadas en este artículo
1 https://www.php.net/versiones-soportadas.php