Añadir excepciones a modSecurity desde .htaccess para evadir falsos positivos

Por: Sergi Rodríguez
17-09-2020 18:52

Si estás leyendo esto ya debes saber que modSecurity es un módulo del servidor Apache creado para filtrar ciertas visitas que pueden suponer un riesgo para la seguridad. El problema es que a veces se dan FALSOS POSITIVOS. Te enseñaré un truco que a mí me ha sacado de apuros más de una vez.

El truco es simplemente desactivar algunas reglas para ciertas URLs añadiendo unas pocas líneas a tu .htaccess.

Debes saber que desactivar reglas de un filtro de seguridad no es la solución ideal. Pero si lo haces con cuidado puede ser la única solución. Y el cuidado lo vamos a poner en la desactivación de unas cuantas reglas solamente y solamente en ciertos formularios.

Caso de ejemplo

En concreto, mi problema de falsos positivos me ha sucedido ya con dos CMS, el mío propio y Chamilo LMS. En ambos casos, hay un rango de reglas de modScurity que saltan cuando desde un formulario (POST) tratas de enviar ciertos códigos HTML y/o Javascript. Cosas tan inocuas normalmente como estos símbolos que anteceden a una parte de código HTML que quieras desactivar en tu página:

<!--

Si tratas de enviar eso por una variable POST, es probable que te salte un falso positivo de ataque XSS. Lo cuál es un auténtico fastidio, pues es algo habitual en HTML.

¿Cómo saber que es un problema de modSecurity?

Si estás en este artículo es porqué ya debes saber la respuesta, pero la voy a compartir por si acaso. Probablemente si una regla de modSecurity saltó por ese envío de tu formulario en el navegador web "simplemente" recibirás un error 402 y el resto de la página en blanco. Lo cuál ciertamente es bastante desconcertante, pues uno no imagina fácilmente a que se deberá ese error.

Pero en fin, el procedimiento indica que lo primero que debes hacer es consultar los archivos de LOG de tu servidor. En uno de estos dos encontrarás la pista de qué sucede:

error.log
access.log

Dependiendo del tipo de hospedaje que estés usando (compartido, VPS,...) esos archivos pueden hallarse en rutas diferentes:

  • Si es una VPS probablemente estén en /var/log&apache2/
  • Pero si es un hosting compartido pueden estar en un directorio del tipo /logs/ en la "raíz" de tu cuenta de hospedaje.

La cosa está en que al final de uno de esos archivos encontrarás una mención a la URL que te está retornando el error y una mención a modSecurity.

¿Cómo saber qué reglas desactivar?

Te mostraré un ejemplo del error y ahí te muestro donde sacar el código numérico de la regla que saltó:

[Fri Sep 18 03:39:23.001912 2020] [:error] [pid 2341:tid 140190576224000] [client 177.228.74.147:47750] [client 177.228.74.147] ModSecurity: Access denied with code 403 (phase 2). Matched phrase "<!--" at ARGS:descripcion_html. [file "/etc/modsecurity/07_XSS_XSS.conf"] [line "56"] [id "212340"] [rev "4"] [msg "WAF: Cross-site Scripting (XSS) Attack||www.midominio.org|F|2"] [data "Matched Data: <!-- found within ARGS:descripcion_html: Curso: para profesionales......"] [severity "CRITICAL"] [tag "CWAF"] [tag "XSS"] [hostname "www.midominio.org"] [uri "/admin.php"] [unique_id "X2QPylJihFgAAAklSIUAAAAR"], referer: https://www.midominio.org/admin.php?pag=admin_textos&idt=1113033769

El código de la regla es: [id "212340"]

¿Cómo desactivamos la regla?

De hecho, en ocasiones anteriores me sucedió que después de desactivar una regla me saltaba otra regla, obviamente por alguna otra razón. Así que finalmente decidí desactivar un rango de reglas y solamente para el archivo admin.php, lo cuál no es tan arriesgado, teniendo en cuenta de que para acceder a esos formularios en admin.php primero hay que autenticarse como usuario.

Y sí, es cierto que algún malware residente en el navegador de mis usuarios administradores podría aprovechar que el usuario se autenticó para realizar el ataque. Pero vaya, ya es bastante más remoto el asunto. Aunque ciertamente no me parece la solución definitiva, solo un parche de emergencia.

Estas son las líneas de código a añadir en el .htaccess:

# Add exception for: admin.php
# we need it because this form generate false positive of XSS Atack

<IfModule mod_security.c>
    <If "%{REQUEST_URI} =~ m#admin#">
        SecRuleRemoveById 212000-212999
    </If>
</IfModule>
<IfModule mod_security2.c>
    <If "%{REQUEST_URI} =~ m#admin#">
        SecRuleRemoveById 212000-212999
    </If>
</IfModule>

En realidad con el segundo bloque (mod_security2.c) sería suficiente si tu servidor ya usa la última versión de mod_security. Pero vaya, no molesta poner ambas y así te funcionará sea cuál sea la versión instalada.

Etiquetas : seguridad | servidores

Comentarios 0 Visitas 8

Comentarios


Añada su comentario:

(pregunta anti-robots)

Enviar

DÍGANOS QUÉ NECESITA

¡¡ Le respondemos antes de 24h !!
Puede dejarnos su teléfono.

Puede rellenar el formulario (pulsar botón derecha) o bien aquí tiene nuestros datos de contacto.

(pregunta anti-robots)
Revisar consentimientos a cookies