Blog de Internet Security Auditors

Blog de Internet Security Auditors: Cómo proteger Wordpress (2/3): Configuraciones de seguridad con .HTACCESS

Escrito por Internet Security Auditors | Jun 13, 2018 4:00:00 AM
Continuando el primer artículo de esta serie de recomendaciones sobre cómo proteger Wordpress, abordaremos esta vez una serie de recomendaciones para configurar en nuestro servidor web privado.

Nos apoyaremos en este caso en el fichero .htaccess, un archivo de configuración muy conocido en entornos web php y que nos permite aplicar políticas de acceso a directorios y ficheros. No es objeto de este artículo explicar cómo funciona htaccess, partimos de la base de que ya existe ese conocimiento y partiremos de ahí para hacer nuestras recomendaciones.

Desactivar la navegación de directorios
Wordpress trae habilitada por defecto la navegación de directorios en varias partes de su estructura. Por citar sólo algunos ejemplos podríamos encontrar:

http://192.168.10.3/wp-content/uploads/ 
http://192.168.10.3/wp-includes/ 
http://192.168.10.3/wp-content/plugins/plugin-name/

Esto permite a un atacante navegar por los directorios pudiendo tener acceso a ficheros ocultos.

Para deshabilitar esta característica añadiremos la línea:

Options All -Indexes

Bloquear la enumeración de usuarios
Es posible identificar los usuarios de una instalación de Wordpress de una manera bastante sencilla. Las peticiones:

http://ejemplo.com/?author=0 
http://ejemplo.com/?author=1  
http://ejemplo.com/?author=2  


automáticamente redirigen a unas url con el enlace permanente donde se muestra el username real de quien escribió:

http://ejemplo.com/author/usuario0/
http://ejemplo.com/author/usuario1/
http://ejemplo.com/author/usuario2/


Incluso añadiendo el nombre en el título la página:


Para evitar esta práctica podemos redirigir al atacante a una url externa cada vez que la petición coincida con el patrón mencionado anteriormente. Podemos añadir las siguientes líneas:

<IfModule mod_rewrite.c>
    RewriteCond %{QUERY_STRING} ^author=([0-9]*) [NC]
    RewriteRule .* http://example.com/? [L,R=302]
</IfModule>

Siendo example.com el sitio al que enviar la redirección.

Bloquear ficheros readme.html readme.txt y similares
Por consenso y estandarización, todos los desarrolladores de plugins y plantillas han de incluir el fichero readme.txt en su paquete de instalación. En dicho fichero se hace una descripción del plugin o plantilla: su desarrollador, la versión, una descripción del mismo, o instrucción de instalación entre otras.

De la misma forma, en cada versión nueva que se lanza, Wordpress añade el fichero readme.html  donde igualmente se muestra la versión instalada.

Éstos son solo dos ejemplos, pero existen más ficheros con información de configuración, y para evitar estas filtraciones de seguridad vamos a bloquear el acceso a todos estos ficheros:

RewriteRule (?:readme|license|changelog|-config|-
sample)\.(?:php|md|txt|html?) - [R=404,NC,L]


Proteger el área de administración restringiendo por IP
En el primer artículo  de esta serie, comentábamos la necesidad de proteger el portal de login de Wordpress contra ataques de fuerza bruta. En dicho artículo recomendábamos el uso del algún plugin de seguridad que permitiera el bloqueo de usuarios por intentos fallidos al introducir contraseña.

En este sentido gracias al fichero .htaccess vamos a añadir una capa de seguridad antes del propio Wordpress. En los casos en los que la administración de la página siempre se haga desde unas localizaciones físicas con IP estática, se puede restringir el acceso para que exclusivamente se pueda hacer desde esas IPs:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "WordPress Admin Access Control"
AuthType Basic
<LIMIT GET>
order deny,allow
deny from all
# oficina
allow from xx.xx.xx.xxx
# VPN
allow from zz.zz.zz.zz
</LIMIT>

Proteger el acceso al área de administración con usuario y contraseña
En los casos en los que no se pueda restringir por IP o en los que se quiera añadir una capa adicional, podemos configurar un acceso por usuario y contraseña al portal del login.


Tendremos que crear un fichero con las credenciales:

htpasswd -c /path/.htpasswd usuario

Donde /path es la ruta donde queremos dejar el fichero, que debe estar fuera del esquema de carpetas del servidor web. usuario es el username de la credencial. El comando nos pedirá por duplicado la contraseña.

A continuación creamos un fichero .htaccess en el directorio /wp-admin/ con las siguientes líneas:

AuthName "Panel de admin"
AuthUserFile /path/.htpasswd
AuthGroupFile /dev/null
AuthType basic
require valid-user
Donde /path es la ruta donde se dejó el fichero .htpasswd.

Bloquear tráfico XMLRPC
El protocolo XMLRPC es un protocolo de comunicación via HTTP de datos en formato XML. Este protocolo se utiliza como si se tratase de una API para conectar el Wordpress con aplicaciones de terceros. Esta comunicación se hace a través del fichero:

http://ejemplo.com/xmlrpc.php

Este protocolo tiene el riesgo de sufrir ataques de denegación de servicio, así que en caso de no utilizarse es recomendable bloquear su acceso:

<Files xmlrpc.php>
order deny,allow
deny from all
</Files>

Redirigir todas las páginas de error del servidor web a una página estándar

Habitualmente los atacantes consiguen inferir bastante información de las aplicaciones web con los mensajes de error. Por ejemplo, si se hace una petición a un recurso y éste no existe devolverá un error 404 (not found) con su página correspondiente, pero si el recurso existe pero no se tiene permisos sobre él obtendremos un 403 (Forbidden) y otra página de error. Aquí ya se puede deducir información.



Por este motivo una buena práctica es capturar estas respuestas y devolver una web genérica en su lugar para que el atacante no reciba los mensajes a primera vista:

ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html

En el siguiente artículo, abordaremos algunas recomendaciones de seguridad bajo el concepto de Seguridad por ocultación.

Autor: Gonzalo Sánchez Delgado
Dpto. Auditoría