Cómo proteger correctamente la seguridad de WordPress
WordPress es el gestor de contenidos CMS por excelencia y el más extendido entre la comunidad de desarrolladores, pero se calcula que 3 de cada 4 sitios hackeados utilizan WordPress. La seguridad en servidores y plataformas web es un aspecto muy importante, pero que no todos los administradores tienen en cuenta, o incluso no se toman el tiempo suficiente para configurarlos correctamente.
Algunas buenas prácticas a la hora de configurar WordPress son:
No esperes ver un defacement en la portada de tu sitio web, eso no les interesa a los atacantes, prefieren que tu no puedas ver que has sido hackeado mientras ellos distribuyen usando tu blog todo tipo de malware.
Los principales indicadores que sitio web ha sido comprometido son:
Escructura interna de WordPress
En el fichero de configuración: wp-config.php
Para los Themes y plugins añadir:
Otra opción no recomendada sería evitar todo tipo de cambios desde el escritorio
Si quieres evitar que desde la administración de WordPress se pueda modificar el código de ficheros, puedes añadir la siguiente línea al fichero wp-config.php
Si la web ya está creada y no necesitas añadir nuevos plugins o plantillas, también puedes deshabilitar la instalación de temas y plantillas añadiendo:
También sería útil cambiar el prefijo (prefix) por defecto de las tablas de wp:
Fortalecer la seguridad en WordPress
Algunas buenas prácticas a la hora de configurar WordPress son:
- Mover el directorio wp-content: esta acción ayuda a proteger al sitio contra ataques automatizados Zero Day.
/** Permite mover el directorio wp-content **/
define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/blog/wp-content' );
define( 'WP_CONTENT_URL', 'http://example/blog/wp-content' ); - Cambiar el nombre de usuario admin: este usuario es el que viene por defecto, por lo que es uno de los primeros objetivos de un cibercriminal a la hora de realizar un ataque de fuerza bruta. En las versiones más recientes de WordPress, es posible seleccionar el nombre de usuario durante la instalación.
- Mínima instalación de plugins: muchos de éstos son susceptibles a Cross-Site Scripting (XSS) e inyección de SQL; si se instalan pocos plugins se reducirán vectores de ataques.
- Mover wp-config.php fuera del directorio raíz web: si movemos este archivo una carpeta más arriba del directorio web raíz, lograremos que no se vea la configuración de nuestro WordPress.
- Quitar el listado de directorios en el servidor: WordPress sufre Full Path Disclosure lo que ayuda a realizar ataques como Path Transversal.
- Administración a través de SSL: a veces, el panel de administración se usa por protocolo sin cifrar HTTP, pero si ingresamos mediante HTTPS estamos enviando los datos encriptados, lo que dificulta la intercepción de información y evita ataques de tipo MITM.
define( 'FORCE_SSL_ADMIN', true ); //Forzar inicio de sesión seguro a la administración.
define( 'FORCE_SSL_LOGIN', true ); //Forzar inicio de sesión seguro. - Usar la base de datos sin privilegios de administrador cuando no se requiere: por defecto WordPress solo usa una base de datos de usuarios para todos ellos. Pero con algunos ajustes de código se puede usar un usuario de una base con menos privilegios para usuarios anónimos, lo que reduce considerablemente los riesgos.
- Mantener usuarios con privilegios mínimos: existe la posibilidad de que un usuario con privilegios de administrador tenga una contraseña débil. Concediendo a los usuarios los privilegios indispensables se reducen las posibilidades de que se vean comprometidas sus cuentas.
- Sacar el “Powered by WordPress” del pie de página: los ciberdelincuentes usan este pie de página en buscadores para encontrar potenciales víctimas vulnerables. Para ocultar esa información, tienes que incluir la siguiente línea en el archivo functions.php de tu WordPress:
Remove_action('wp_head', 'wp_generator');
- Lista blanca de IP para acceder al wp-login.php: generalmente los administradores acceden a su blog desde la misma dirección IP, por lo que se configuran estas direcciones como “de confianza” para poder acceder.
- Cambiar el prefijo de las tablas de las bases de datos
/** Prefijo de las tablas de la base de datos, cambiarlas siempre en lo posible por seguridad */
$table_prefix = 'ehn_'; //Sólo números, letras y guiones bajos por favor!
Cómo saber si tu WordPress ha sido hackeado
No esperes ver un defacement en la portada de tu sitio web, eso no les interesa a los atacantes, prefieren que tu no puedas ver que has sido hackeado mientras ellos distribuyen usando tu blog todo tipo de malware.
Los principales indicadores que sitio web ha sido comprometido son:
- Puedes comprobar la salud de tu WordPress con Google Safe Browsing: https://www.google.com/transparencyreport/safebrowsing/diagnostic/?hl=es
- O también directamente en Google Console (antes Webmaster Tools): https://www.google.com/webmasters/tools/security-issues
Indicadores comunes de un sitio web hackeado WordPress
- Advertencias lista negra de Google, Bing, McAfee
- Comportamientos extraños o anormales navegador
- Correo no deseado en el contenido del motor de búsqueda
- La notificación de suspensión sitio web por parte de tu hosting
- Las modificaciones del archivo o temas centrales de integridad
- Advertencias en los resultados de búsqueda de Google (SEO envenenamiento)
- Renombrar fichero wp-login.php para evitar ataques por fuerza bruta (logear intentos e instalar captcha)
Proteger - Securizar - Hardening - WordPress
- Mantener actualizada la versión Core (Núcleo) de WordPress
- Mantener actualizados los Plugins
- Manenter actualizados los Themes (temas de diseño)
- Usar themes y plugins con buena reputación
- Evitar usar contraseñas y/o usuarios por defecto (admin) y/o contraseñas débiles
UPDATE wp_users SET user_login = 'elhacker' WHERE user_login = 'admin';
,
Escructura interna de WordPress
Within
/
- The root WordPress directory: all files should be writable only by your user account, except
.htaccess
if you want WordPress to automatically generate rewrite rules for you./wp-admin/
- The WordPress administration area: all files should be writable only by your user account.
/wp-includes/
- The bulk of WordPress application logic: all files should be writable only by your user account.
/wp-content/
- User-supplied content: intended to be writable by your user account and the web server process.
/wp-content/
you will find:
/wp-content/themes/
- Theme files. If you want to use the built-in theme editor, all files need to be writable by the web server process. If you do not want to use the built-in theme editor, all files can be writable only by your user account.
/wp-content/plugins/
- Plugin files: all files should be writable only by your user account.
En el fichero de configuración: wp-config.php
// automatic wordpress updates
//https://codex.wordpress.org/Configuring_Automatic_ Background_Updates
define( 'WP_AUTO_UPDATE_CORE', true );
# Disables all core updates:
define(
'WP_AUTO_UPDATE_CORE'
, false );
# Enables all core updates, including minor
and
major:
define(
'WP_AUTO_UPDATE_CORE'
, true );
# Enables core updates
for
minor releases (
default
):
define(
'WP_AUTO_UPDATE_CORE'
,
'minor'
);
Para los Themes y plugins añadir:
add_filter( 'auto_update_plugin', '__return_true' );Recuerda también cambiar las "secret keys" (security keys) en el fichero de configuración:
add_filter( 'auto_update_theme', '__return_true' );
define('AUTH_KEY', 'put your unique phrase here');Usar SSL/TLS, es decir, https si tu hosting lo soporta o lo implementa:
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
Otra opción no recomendada sería evitar todo tipo de cambios desde el escritorio
Si quieres evitar que desde la administración de WordPress se pueda modificar el código de ficheros, puedes añadir la siguiente línea al fichero wp-config.php
define( ‘DISALLOW_FILE_EDIT’, true );
Si la web ya está creada y no necesitas añadir nuevos plugins o plantillas, también puedes deshabilitar la instalación de temas y plantillas añadiendo:
define(‘DISALLOW_FILE_MODS’,true)
También sería útil cambiar el prefijo (prefix) por defecto de las tablas de wp:
$table_prefix = 'wp_';
Plugins de Seguridad en WordPress
Usar algún plugin de seguridad como el de Sucuri , iThemes o Acunetix:
- https://wordpress.org/plugins/sucuri-scanner/ (Sucuri)
- https://wordpress.org/plugins/better-wp-security/ (iThemes Security)
- https://wordpress.org/plugins/wp-security-scan/
- https://wordpress.org/plugins/bulletproof-security/
- https://github.com/wpscanteam/wpscan
El plugin de Sucuri se encarga de:
- Security Activity Auditing
- File Integrity Monitoring
- Remote Malware Scanning
- Blacklist Monitoring
- Effective Security Hardening
- Post-Hack Security Actions
- Security Notifications
- Website Firewall (add on)
Ocultar la versión de WordPress:
Por defecto WordPress tiene una meta etiqueta con la versión:
meta name="generator" content="WordPress " /Una opción sería:
remove_action('wp_head', 'wp_generator');
Pero sigue apareciendo en el feed de RSS.
Así que es mejor usar una función en el fichero functions.php para ocultar la versión en todas partes:
function wpversion_remove_version() {
return '';
}
add_filter('the_generator', 'wpversion_remove_version');
O puedes usar un cliente en línea de comandos como wp-cli
Puedes programar para actualizar WordPress con una sencilla tarea programa si la necesidad de usar el navegador.
Ejemplo actualización del WordPress hwagm.elhacker.net
Core:
/usr/local/bin/php /home/hwagm.elhacker.net/wp-cli.phar --path=/home/hwagm.elhacker.net/public_html/hwagm-elhacker-net core updatePlugins
/usr/local/bin/php /home/hwagm.elhacker.net/wp-cli.phar --path=/home/hwagm.elhacker.net/public_html/hwagm-elhacker-net plugin update --allThemes
/usr/local/bin/php /home/hwagm.elhacker.net/wp-cli.phar --path=/home/hwagm.elhacker.net/public_html/hwagm-elhacker-net theme update --allPermisos
Following is a list of desired permissions on sensitive items and fallback options:
- wp-config.php
- Desired: 400
- Fallback: 440, 600, 640
- uploads folder
- Desired: 755
- Fallback: 766, 777 (not recommended)
- .htaccess files
- Desired: 400
- Fallback: 440, 444, 600, 640
Protegiendo el fichero wp-config.php para que no sea visible vía el navegador
<files wp-config.php>
order allow,deny
deny from all
</files>
O restringir el acceso vía ip (si tenemos una ip fija) del fichero wp-login.php
order deny,allowDeshabilitar XML-RPC
Deny from all
# allow access from my IP address
allow from 192.168.5.1
Si te decides a deshabilitar XMLRPC, puedes hacerlo manualmente o utilizando el plugin XMLRPC Disable.
Para hacerlo manualmente has de añadir esta línea en el fichero functions.php:
add_filter('xmlrpc_enabled', '__return_false');
O usar un fichero htaccess:
Y si usamos ngninx en vez de Apache.
## block any attempted XML-RPC requests
order deny,allow
deny from all
allow from 123.123.123.123
## block any attempted XML-RPC requests
location = /xmlrpc.php {
deny all;
}
Los backdoors suelen usar las siguientes funciones de PHP:
- base64
- str_rot13
- gzuncompress
- eval
- exec
- create_function
- system
- assert
- stripslashes
- preg_replace (with /e/)
- move_uploaded_file
Avanzado - Cabeceras de Seguridad en WordPress
La mejor forma de añadir esta cabecera sería añadiendo unas líneas de código al archivos functions.php del tema de WordPress que estemos usando. Este archivo se encuentra en la ruta wp-content/themes/NOMBRE_TEMA, en donde NOMBRE_TEMA es el nombre del tema que tenemos activado. En primer lugar, haremos una copia de seguridad del archivo functions.php. Después lo editamos y añadimos el siguiente código al final del mismo:
add_action( 'send_headers', 'add_header_xframeoptions' );
function add_header_xframeoptions() {
header( 'X-Frame-Options: SAMEORIGIN' );
}
add_action( 'send_headers', 'add_header_seguridad' );
function add_header_seguridad() {
header( 'X-Content-Type-Options: nosniff' );
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'X-XSS-Protection: 1;mode=block' );
}
Existen otras maneras de poner añadir esta cabecera . Si tenemos Apache como servidor web pordemos usar el fichero .htaccess, agregando el código que se indica a continuación:
Header always append X-Frame-Options SAMEORIGIN
En el caso de usar Nginx, habría que introducir el siguiente código en el fichero de configuración de Nginx:
add_header X-Frame-Options SAMEORIGIN;
Via: blog.elhacker.net
Cómo proteger correctamente la seguridad de WordPress
Reviewed by Zion3R
on
17:06
Rating: