Seguridad .htaccess

En alguna oportunidad he mencionado la importancia de un archivo .htaccess con buenas reglas para una mayor seguridad en tu web y en este caso he visto una buena recopilación de reglas creadas por lo que yo llamaría un experto de seguridad web. En principio el archivo .htaccess utilizado por Apache no fue hecho para agregar seguridad a una página web, pero debido a su manejabilidad permite en muchos casos evitar accesos no auorizados. Las reglas son las siguientes:

RewriteEngine On
Options +FollowSymLinks

RewriteCond %{REQUEST_METHOD}  ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]
RewriteCond %{THE_REQUEST}     ^.*(\\r|\\n|%0A|%0D).* [NC,OR]

RewriteCond %{HTTP_REFERER}    ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{HTTP_COOKIE}     ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{REQUEST_URI}     ^/(,|;|:|<|>|">|"<|/|\\\.\.\\).{0,9999}.* [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

RewriteCond %{QUERY_STRING}    ^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]

RewriteCond %{QUERY_STRING}    ^.*\.[A-Za-z0-9].* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]

RewriteRule ^(.*)$ access_log.php

El autor explica cada zona de las reglas en su tema así que yo también lo haré en base a lo que él explicó. El texto originalmente está en ingles y no pretendo hacer una traducción perfecta pero trataré de explicarlo a mi manera:

Primero colocamos la configuración básica para habilitar el mod_rewrite en apache:

RewriteEngine On
Options +FollowSymLinks

La siguiente regla deshabilita el banner de información de apache cuando envía un error como Not Found. Esta función es importante deshabilitarla ya que en algunas versiones de Apache o un apache mal configurado muestra información que podría ser de utilidad para un atacante como muestra la siguiente imagen:

Mostrar la versión de apache y los módulos instalados 8con sus respectivas versiones) podría ser un riesgo de seguridad enorme ya que un atacante podría buscar bugs conocidos para dicha versión (para mi caso habilitar esta función me envió un Internal Server Error así que no es soportada por mi servidor):

ServerSignature Off

Las reglas utilizan 2 flags distintas:

NC - No Case: No distingue mayúsculas o minúsculas
OR - Sip, O: Siguiente condición.

La primera regla está basada en el REQUEST_METHOD. El REQUEST_METHOD es la forma en que se conecta el cliente con nuestro servidor. Para mi caso solo necesito GET o POST, puede que para su caso sea distinto ;).

RewriteCond %{REQUEST_METHOD}  ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]

THE_REQUEST es la petición completa hecha por el usuario y consiste en una cadena larga. Esta es usada para sanar ya que no queremos que un usuario envíe una petición con doble línea lo cual podría permitir un CRLF Injection 😉

RewriteCond %{THE_REQUEST}     ^.*(\\r|\\n|%0A|%0D).* [NC,OR]

HTTP_REFERER puede contener caracteres que pueden ser usados para hacer una Pentest (Test de Intrusión) a una aplicación web. También podría permitir una intrusión de archivos así que bloqueamos los caracteres que no serán usados en peticiones legítimas:

RewriteCond %{HTTP_REFERER}    ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

HTTP_COOKIE es igual de importante y ofrece un lugar para guardar el pentest caracteres lo que quiere decir que guarda en una cookie los caracteres.

RewriteCond %{HTTP_COOKIE}     ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

REQUEST_URI Es importante para la protección del servidor. Sobre todo para proteger de problemas con OverFlows como sucede com Apache Tomcat. Para proteger de esto limitaremos a 9999 caracteres duplicados.

RewriteCond %{REQUEST_URI}     ^/(,|;|:|<|>|">|"<|/|\\\.\.\\).{0,9999}.* [NC,OR]

USER_AGENT Analiza el User Agent (navegador) desde donde se hace la petición. El bloquear algunos user puede evitar que accedan a nuestra web muchos bots atacantes (muy común los libwww) o también hacer peticiones desde WGET (gestor de descargas). Particularmente usaba una regla similar y desde que la implementé dejé de ver ataques de bots insertados en servidores vulnerados.

RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]

QUERY_STRING es probablemente lo más importante de todo porque aquí es donde suceden la mayoría de las cosas. Configurando de buena forma las reglas podemos evitar algunos XSS, algunos SQL Injection, y Remote Shell Injection.

RewriteCond %{QUERY_STRING}    ^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*\.[A-Za-z0-9].* [NC,OR]
RewriteCond %{QUERY_STRING}    ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]

Finalmente si apache consiguiera alguna de las peticiones bloqueadas en la regla podemos redirigir al usuario a una página o directamente bloquear el acceso. Originalmente la regla está hecha para enviar al posible atacante a una página alojada en el servidor llamada access_log.php el cual podría contener un script o podría ser una página hecha por usted:

RewriteRule ^(.*)$ access_log.php

Para mi caso particular prefiero enviar un mensaje de acceso denegado con la siguiente regla:

RewriteRule ^(.*)$ - [F]

Eso enviará al posible atacante a una página de error 403 Forbidden o acceso denegado.

Las reglas me parecieron bastante chéveres a pesar de que yo ya usaba la mayoría había una que otra que no conocía y decidí agregar. Siempre es bueno que a su vez hagan una búsqueda más extensa de más reglas para bloquear accesos y a su vez aprendan a utilizar cada regla según su conveniencia.

Herramientas Onlie .htacceess: http://tools.dynamicdrive.com/

Fuente: http://util-pc.com

One thought on “Seguridad .htaccess

  1. se puede declarar varias reglas en un archivo .htaccess, ya que en el mio solo por decir ejecuta la primera regla las demas no :S

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*