Inicio | Un poco de seguridad con htaccess

Un poco de seguridad con htaccess

Jueves, 26 de Mayo de 2011 21:45

Quizás sean pocos los lectores a los que no le suene la potencialidad de htaccess, sin embargo a menudo solemos infrautilizar todo el potencial que este pequeño archivo de configuración puede encerrar.

Htaccess es un contenedor de directivas y reglas que guardado a nivel de directorio de nuestro proyectos web complementan el archivo de configuración de Apache.

Uno de los planteamientos mas divertidos de .htaccess es su uso como herramienta de seguridad, o más bien de ofuscación de nuestros archivos y directorios, de manera que ayude a mantener a “mentes curiosas” lejos de los archivos y directorios sensibles de nuestros proyectos.

A menudo cuando se trabaja en la dura realidad de la empresa, donde la productividad pesa más que la elegancia, nuestros proyectos web son lanzados no todo lo maduros que desearíamos, por lo que un buen .htaccess puede ahorarnos algun bochorno delante de nuestros clientes.

A continuación voy a describir una serie, de técnicas, que pueden ayudarnos a relajar un poco la seguridad de nuestras aplicaciones o guardarnos un poco las espaldas, cuanto usamos código de otras personas.

No voy a entrar demasiado en detalle de las explicaciones de directivas y expresiones ya que hay suficiente documentación en la Red sobre ello.

Como otros artículos de este site, no pretendo arrojar otro manual mas de htaccess a la Red, sino mas bien aportar algunas ideas que el lector debe ajustar a sus necesidades y estrategias.

Activar .htaccess

Para que htaccess sea funcional hay que especificar la directiva en nuestro host virtual:

AllowOverride All

También puede ser que necesites un:

Options +FollowSymLinks

Activar mod_rewrite

La mayoría de reglas usan mod_rewrite, ya que se basan en el filtrado del URL y no en tareas de acceso propiamente a archivos y direcctorios,  por tanto debemos disponer de el en nuestro servidor.
Si usamos un hosting publico, habrá que comprobar que esta soportado. Si administramos nuestro propio hosting basta con un:

a2enmod rewrite

Para familiarizarte en profundidad con mod_rewrite visita su documentación oficial.

Algunas reglas de seguridad para el htaccess interesantes:

Inyecciones SQL

Una de las pesadillas más antiguas de las vulnerabilidades web son las inyecciones sql. Mediante la inyección de fragmentos de código SQL en los valores de nuestras variables:

mipass=’ OR ''='
miuser=' AND 0 UNION SELECT 1 AND 'l'='

A veces se pueden conseguir algunos resultados divertidos. El uso del siguiente conjunto de reglas nos ayudará a filtrar la mayoría de estas situaciones:

 
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} \.\./\.\. [OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]

Bloqueo de agentes y utilidades de línea de comandos

Algunas herramientas de búsqueda y explotación de vulnerabilidades o los conocidos downloaders poseen agentes particulares y fáciles de detectar como: wget, curl, java, HTTrack, perl, java, etc

Si por ejemplo hacemos en nuestra terminal un:

wget www.miweb.com/index.php

Obtendremos un “Petición HTTP enviada, esperando respuesta... 403 Forbidden” siempre y cuando tengamos este código en nuestro .htacces:

 
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-perl|curl|wget|python|nikto|scan) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]

Inclusión de archivos remotos (RFI) y compañía

Mediante las técnicas de XSS o RFI se incluye en nuestra web un script albergado en otra URL, normalemente una web anfitriona que ya fue atacada previamente, que va a servir para alterar el comportamiento de nuestra aplicación y probablemente servir de puerta de entrada para algún backdoor o shell:

miVariable=http://urlatacante.com/shell.php

Las siguientes reglas nos van ayudar a minimizar este tipo de situaciones o la navegación de directorios desde la url:

  RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]

Bloqueo de acceso a directorios:

Quizás una de las reglas mas curiosas es simplemente evitar que el usuario pueda acceder directamente al árbol de directorios directamente desde la url:

RewriteRule ^(cache|includes|logs|tmp)/ - [F]

Gracias a esta sentencia obtendremos un “Forbiden” si hacemos un:

http://www.miweb.com/cache

Bloquear el acceso a determinados archivos

Una técnica un poco mas refinada que la anterior. Se basa en la posibilidad de restringir el acceso directo a ciertos archivos de nuestra web en función de su extensión: php, xml, tpl, etc

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/library\/ [OR]
RewriteCond %{REQUEST_URI} \/images\/ [OR]
RewriteCond %{REQUEST_URI} \/cache\/
RewriteRule ^(.*)$ index.php [R=404]

Así de esta forma si hacemos un:

http://www.miweb.es/library/index.php
http://www.miweb.es/cache/rss.xml

Vamos obtener un “404 Not Found”. Fíjate que donde antes hacíamos [F] de “forbiden” ahora con [R=404] arrojamos un 404 o cualquier otro error, una técnica interesante para "despistar".

Protección por contraseña de direcctorios

Un clásico de la protección de directorios con .htaccess es la protección mediante contraseña. Esta técnica es interesante para reforzar la autenciación de paneles de control o formularios de autenticación.
Para proteger con contraseña un directorio basta con crear un .htaccess en dicho directorio con el siguiente código

  AuthName "Introduce Tus Datos:"
AuthType Basic
AuthUserFile /www/miweb/.htpasswd
AuthGroupFile /dev/null
Require valid-user

En la directiva AuthUserFile deberemos colocar la ruta de nuestro archivo de passwords. Hay abundante documentación sobre la creación de los passwords de htpasswd. Por ejemplo desde una terminal podemos teclear:

htpasswd -nb usuario contraseña

Nos arrojará el contenido de nuesto archivo de passwords:

usuario:ECiz4oJ8cryR6

El archivo .htpasswd puede denominarse con cualquier otro nombre y debe colocarse fuera de cualquier ruta pública, y de ser posible fuera del open_basedir del PHP.

Tienes la documentación sobre la creación de passwords para htpasswd.

Protección de directorios por IP

El tema de la protección con contraseña esta bien, pero es engorroso tener que memorizar dichas contraseñas. Si accedemos siempre a nuestras web desde la misma ubicación, quizás sea interesante una protección por IP o rango de IP.
Para ello podemos usar por ejemplo:

  Deny from all
Allow from 83.165.114.0
Satisfy any

Este ejemplo es válido si tenemos una ip fija. Sin embargo si lo que nos interesa mas que proteger un directorio es ofuscarlo para sacarnos de encima un porcentaje amplio de fisgones, podemos autorizar el acceso para un determinado rango. Podemos ver que IPs publicas se nos asignan comúnmente y abrir nuestro directorio para ese rango, por ejemplo:

  Deny from all
Allow from 83.165
Satisfy any

De esta forma estamos dando acceso a todo el rango 83.165.xxx.xxx

Esta técnica se puede combinar con la anterior para evitar tener que introducir la contraseña desde ciertas conexiones:

  AuthName “Tu panel”
AuthType Basic
AuthUserFile /www/miweb/.htpasswd
AuthGroupFile /dev/null
Require valid-user
Deny from all
Allow from 192.168.0
Satisfy any

La directiva “Satisfy any” nos indica que tenemos que cumplir una de las dos condiciones, si usásemos “Satisfy All” debemos cumplir las dos condiciones.

Otro uso bastante interesante de las directivas Allow o Deny es poder limitar el acceso de usuarios por país.

En paginas como esta www.ipaddresslocation.org podemos obtener el rango de IPs de un país para permitirlo o denegarlo. Esta técnica sencilla de implementar nos ahorra bastantes curiosos entre nuestros archivos, ya que la mayoría de intrusos provienen del extranjero.

Al final de esta web teneis un htacces para restringir el acceso sólo a visitantes que se conecten desde España.

Manejo de errores

Administrar correctamente los errores generados por nuestra web es una útil técnica de ofuscar la estructura de nuestras web. De los errores que arroja una web se puede aprender mucho, si un directorio existe aunque este prohibido su acceso, si determinado método esta o no habilitado, etc,... Ocultar, ofuscar, confundir, etc personalizando nuestros errores mas frecuentes es una divetida técnica de seguridad.

Por ejemplo con:

ErrorDocument 404  http://www.misitio.com

Redirigiremos al usuario a la página principal de nuestro dominio sin dar mas explicaciones. Sin embargo esta técnica si la aplicamos en subdirectorios nos puede servir, sin embargo si la usamos en el root de nuestro sitio, acabará redireccionandose a si misma, generando un error en el explorador.

Con esto:

ErrorDocument 404  /errores/errorgenerico.php

Redirigiremos al visitante a una página, indicando que ha habido un error pero sin decir cual. Es una forma elegante de solucionar la situación.

Si no queremos complicarnos también se puede solucionar así:

  ErrorDocument 404  “Ups! Se ha producido un error”
ErrorDocument 403 “Ups! Se ha producido un error”
ErrorDocument 400 “Ups! Se ha producido un error”
ErrorDocument 406 “Ups! Se ha producido un error”
ErrorDocument 412 “Ups! Se ha producido un error”
ErrorDocument 416 “Ups! Se ha producido un error”
ErrorDocument 501 “Ups! Se ha producido un error”
ErrorDocument 401 “Ups! Se ha producido un error”
ErrorDocument 500 “Ups! Se ha producido un error”

Cuando se produce un error que no hemos controlado, también se volcará la firma del explorador: versión, módulos, sistema operativo, etc,... esta información es igualmente útil para conocer posibles vulnerabilidades del mismo. Dicha situación se puede evitar con un simple:

ServerSignature Off

Restringir acceso a determinados archivos

A veces puede ser interesante denegar cualquier acceso a determinados ficheros. Las directivas Files y FilesMach permiten a través de expresiones regulares controlar el acceso a determinados archivos o directorios. Por ejemplo:

 <Files ~ "\.old$">
Order allow,deny
Deny from all
Satisfy all
</Files>

Bloquea cualquier acceso a un fichero que termine con la extensión .old

De forma similar:

 <FilesMatch "(^|/)_">
Order allow,deny
Deny from all
Satisfy all
</FilesMatch>

Bloqueará el acceso a cualquier fichero o directorio que empiece por una barra baja “_”

Impedir la ejecución de PHP

Otro recurso interesante es impedir el acceso a archivos .php que puedan ser introducidos mediante exploits en nuestra web. Normalmente ciertos CMS como Joomla o Wordpress tienen directorios donde se almacenan imágenes, y donde no se deberia acceder o almacenar ningun archivo .php. Dado que muchos exploits se introducen a través de vulnerabilidades en los scripts de carga de imágenes, podemos bloquear facilmente el acceso a documentos del tipo .php en determinados directorios:

<Files *.php>
Deny from all
</Files>

Otro proceso similar seria liminar el acceso exclusivo a documentos de imagen en ciertos directorios

Order Allow,Deny
Deny from all
<FilesMatch "^[^.]+\.(?i:jpe?g|png|gif)$">
Allow from all
</FilesMatch>

Sin embargo algunos exploits se introducen bajo el nombre de xxx.php.gif por lo que tampoco es mala idea bloquear este tipo de estructura de nombres:

<FilesMatch "\.(php|php\.)(.+)(\w|\d)$">
Order Allow,Deny
Deny from all
</FilesMatch>

Exploración de directorios.

Hoy en día la mayoría de hostings ya lo traen correctamente configurado, pero la posibilidad de listar el contenido de nuestros directorios, no suele ser una buena opción salvo que sea intencionada.
La exploración de directorios se puede evitar con un simple index.html o index.php por directorio, pero lo mas elegante es un:

 Options -Indexes 

Conclusiones

Estas son algunas propuestas, que combinadas de forma oportuna pueden ayudarnos, quizás no, a blindar nuestra web, sino más bien a borrar las máximas evidencias posibles que puedan dar indicios, a los usuarios más curiosos, de posibles vulnerabilidades en nuestro sitio.

Sin embargo es muy importante mantener nuestro sitio actualizado, ya que pueden existir vulnerabilidades evidentes, donde por mucho htaccess que tengamos configurado, permiten introducir exploits y backdoors facilmente en nuestra web.

A continuación os dejo algunos .htaccess con los ejemplos indicados a lo largo de este artículo:

 

x-rite Professional LED Lighting, DSLR Support and Accessories for Photo and Video BabelColor asociacion española de imagen cientifica y forense