Saltar al contenido

El objetivo de este artículo es proporcionar la comprensión genérica de los controles de seguridad de WordPress, debido a que es uno de los gestores de contenido más usados a nivel mundial, con más de 65 millones de aplicaciones activas basadas en WordPress, lo que equivale casi un 20% de las páginas web en Internet.

El paradigma AMP corresponde a Apache, MySQL y PHP, los tres de código abierto interactuando para un fin común: la puesta en marcha del WordPress.

Los Principales riesgos de WordPress son:

  • WordPress desactualizado.
  • Temas y extensiones desactualizadas o de dudoso origen.
  • Contraseñas fáciles y panel de WP-ADMIN habilitado.
  • Bases de datos expuestas.
  • Servidores compartidos.
  • Mostrar la versión usada.

Para tener una aplicación robusta basada en WordPress es recomendable seguir los siguientes consejos de seguridad:

Actualizaciones de WordPress

Es importante mantener siempre actualizado a la última versión WordPress, sus componentes, temasy plugins. Para realizar las actualizaciones de forma automática se puede hacer uso del plugin Advance Automatic Updates, además es recomendable automatizar las copias de seguridad y tener siempre un back up de los datos antes de actualizar, el plugin UpdraftPlus ayuda a automatizar este proceso.

Ajustes Generales

Se debe deshabilitar la opción por defecto que permite el registro de cualquier persona, en caso de necesitar la opción se debe elegir con el perfil que contenga menos privilegios y se recomienda instalar el plugin Stop Spammer, de forma que no puedan registrarse de forma automática.

Blindar el acceso al archivo wp-config.php

Se debe acceder al archivo wp-config.php ir a la sección de claves únicas de autentificación y cambiar los valores como lo indica el comentario. También debemos crear un archivo llamado .htcaccess y lo editamos con lo siguiente:

<files wp-config-php>
arder allow.deny
deny from all
<files>

De esta forma si alguien ingresa al sistema no podrá acceder al fichero.

Cambiar el prefijo de las bases de datos

Editar el archivo wp-config.php ubicando la línea $table_prefix = ‘wp_’; y cambiarlo por cualquier otra cosa como el nombre del proyecto $table_prefix = ‘BB_’

También podemos instalar estas extensiones para realizar estos pasos de forma automatizada:

Con estos pasos estamos haciendo más robusto nuestro WordPress ya que un atacante no podría reconocer la base de datos como una base de datos perteneciente a un proyecto de WordPress.

Cambiar la ruta de acceso wp-admin

Se debe hacer uso del plugin HC Custom WP-Admin URL, una vez instalado, desde ajustes seleccionar enlaces permanentes y luego al final de la página donde pone WP-admin slug, se debe colocar la nueva ruta de acceso al panel de administración.

Control de Usuarios

  • Siempre se debe trabajar con el principio de mínimo privilegio.
  • Cambiar el nombre de usuario del administrador que da por defecto al instalar el WordPress (admin), a cualquier otro nombre que no sea fácil de adivinar por un atacante.
  • Uso de doble factor de autenticación instalando el plugin de Google 2FA.
  • Uso de contraseñas robustas, usar herramientas como Keepass.

Deshabilitar la ejecución de PHP en algunos Directorios

Se debe crear un fichero .htaccess y colocarlo en los directorios que se deseen proteger como /wp-includes/, /wp-content/ añadiendo el siguiente código

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

De esta forma se evita que se ejecute código dentro de estas carpetas.

Eliminar Extensiones y Temas

Es necesario eliminar las extensiones y temas que no se usan ya que, aunque tengamos la extensión deshabilitada, esta podría ser un punto de entrada para un atacante. Al estar deshabilitada no se actualiza y podría tener alguna vulnerabilidad, aprovechable por algún atacante.

Eliminar listado de directorios

Donde no existe contenido ejecutable, se debe agregar un archivo llamado index.php, de forma que si se intenta listar ese directorio, se ejecutará el index.php. Desde el archivo creado previamente .htcaccess, se debe agregar la siguiente línea:

Options All -Indexes

Evitando que vía HTML se puedan listar los directorios internos.  

Entrada de comentarios

Limitar entradas del usuario de forma que todo lo que introduzca llegue en texto plano sin ningún tipo de formato, para ello desde la carpeta wp-content dentro del fichero functions.php, se debe agregar el siguiente código:

add_filter( ‘pre_comment_content’, ‘wp_specialchars’);

logrando quitar toda interpretación de código. Adicionalmente se debe agregar al archivo .htaccess el siguiente código:

RewriteEngine On 
RewriteBase / 
RewriteCond %{REQUEST_METHOD} ^(OPTIONS|HEAD|TRACE|DELETE|TRACK) [NC] 
RewriteRule ^(.*)$ - [F,L] 
RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR] 
RewriteCond %{QUERY_STRING} tag\= [NC,OR] 
RewriteCond %{QUERY_STRING} ftp\: [NC,OR] 
RewriteCond %{QUERY_STRING} http\: [NC,OR] 
RewriteCond %{QUERY_STRING} https\: [NC,OR] 
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] 
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [NC,OR] 
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR] 
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>|ê|"|;|\?|\*|=$).* [NC,OR] 
RewriteCond %{QUERY_STRING} ^.*("|'|<|>|\|{||).* [NC,OR] 
RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127\.0).* [NC,OR] 
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR] 
RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare).* [NC] 
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$ 
RewriteRule ^(.*)$ - [F,L]

Con estos comandos añadidos se robustecen las entradas de los datos de usuarios, filtrando caracteres que podría provocar una inyección de código. 

Evitar automatización de peticiones

Haciendo uso de captcha con el plugin Easy Captcha o sin captcha midiendo el tiempo para identificar si se trata de un usuario o una máquina.

Intento inicio de sesión en WordPress

El plugin login lockDown que tiene la capacidad de registrar la IP y la marca de tiempo de cada intento fallido, bloqueándolos. Es configurable el número de intentos fallidos y el periodo de tiempo que se desee bloquear. Además permite eliminar el exceso de información que el WordPress por defecto arroja al introducir de forma errónea unas credenciales diciendo si el usuario o la contraseña está incorrecta, dejando sólo el mensaje de acceso incorrecto.

Ocultar la versión

Eliminar el archivo readme.txt. Es preciso eliminar también las pistas que indican la versión del WordPress en todas las entradas del proyecto, para ello se debe abrir el archivo functions.php que se encuentra dentro de la carpeta del tema utilizado, y en la parte inferior del archivo se deben crear las siguientes líneas:

remove_action (‘wp_head’, ‘wp_generator’);
remove_action (‘wp_head’, ‘wlwmanifest_link’);
remove_action (‘wp_head’, ‘rsd_link);

Esto eliminará de las cabeceras las versiones que muestra el sistema dando información innecesaria.
 
Proteger el archivo .htaccess

Se puede autoproteger anexando dentro las siguientes líneas de código:

<Files ~”^.*\.([Hh][Tt][Aa])”>
Order allow, deny
Deny from all
Satisfy all
</Files>

Esto impedirá el acceso a todos los archivos que comiencen por .htaccess

Proteger el área de Administración por IP

Puede que hayas instalado WordPress en un servidor y quieras que solo desde ciertas localizaciones se pueda acceder al área de administración.

En este caso, el código que debes usar es el siguiente:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "WordPress Admin Access Control"
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all
#IP permitida
allow from 192.xx.xx.xx
#Otra IP permitida
allow from 192.xx.xx.xx
</LIMIT>

Protege la carpeta de archivos subido

La carpeta uploads donde se suben las imágenes y documentos que adjuntan los usuarios, es la más susceptible de ataques, añadimos el siguiente código en el fichero .htaccess

<Files ~ ".*\..*">
Order Allow,Deny
Deny from all
</Files>
<FilesMatch"\.(jpg|jpeg|jpe|png|bmp||doc|pdf|rtf|xls|zip|rar)$">
Order Deny,Allow
Allow from all
</FilesMatch>

Definiendo expresamente qué extensiones de archivo se podrán subir.

Restricciones de acceso

Instalando el plugin de acunetix, se puede realizar un escaneo de todo el proyecto, identificando los archivos y carpetas con permisos inadecuados y ofreciendo la sugerencia de permisos adecuados, para prevenir que otros usuarios puedan borrar o ejecutar archivos.

Uso de encabezados De Seguridad HTTP

Se basa en una configuración a nivel del servidor web y le indican al navegador como manejar el contenido de su sitio, evitando ataques como: clickjacking, Cross-Site Scripting (XSS), entre otros.

X-Frame-Options
X-XSS-Protection
X-Content-Type
Content-Security Policy
Strict-Transport-Security

Este artículo solo contiene algunas recomendaciones de seguridad que ayudarán a fortificar los proyectos en WordPress. Entendemos que la seguridad absoluta no existe y menos en este tipo de plataformas tan ampliamente utilizadas, sin embargo, comencemos a dar pasos para mejorar nuestros productos y a tomar mayor conciencia de la ciberseguridad, lo que redundará positivamente en un robustecimiento de nuestros desarrollos y un aumento en la calidad de nuestro trabajo.  

Antonio Claret
Antonio Claret

Responsable de Ciberseguridad y perito informático judicial en BABEL.

logo linkedin compartir en Linkedin Contacto

Otros artículos destacados