lunes, 13 de marzo de 2017

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 s

e 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.

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:

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 

 Sentencia SQL para cambiar el usuario Admin por nuestro usuario

UPDATE wp_users SET user_login = 'elhacker' WHERE user_login = 'admin';

 Escructura interna de WordPress

/ 
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.
Within /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' );
add_filter( 'auto_update_theme', '__return_true' );

Recuerda también cambiar las "secret keys" (security keys) en el fichero de configuración:

define('AUTH_KEY', 'put your unique phrase here');
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');

 Usar SSL/TLS, es decir, https si tu hosting lo soporta o lo implementa:

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:

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/http://ift.tt/2mNq7xc --path=/home/http://ift.tt/2ngW8f4 core update 

Plugins

/usr/local/bin/php /home/http://ift.tt/2mNq7xc --path=/home/http://ift.tt/2ngW8f4 plugin update --all

Themes

/usr/local/bin/php /home/http://ift.tt/2mNq7xc --path=/home/http://ift.tt/2ngW8f4 theme update --all

Permisos

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

 Podemos también proteger WordPress usando ficheros .htaccess

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,allow
Deny from all
# allow access from my IP address
allow from 192.168.5.1

Deshabilitar XML-RPC

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:


## block any attempted XML-RPC requests

order deny,allow
deny from all
allow from 123.123.123.123

Y si usamos ngninx en vez de Apache.


## 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 http://ift.tt/2lOevuI

No hay comentarios:

Publicar un comentario