Seguridad en webs con mod_rewrite

Para el que no lo sepa, mod_rewrite es un módulo del servidor web Apache que nos permite, a través de un .htaccess, reescribir urls. Con esto, a parte de ganar puntos en Google, para mejorar el posicionamiento de nuestra página, también permite ‘ocultar’ los parámetros que se envían de una página a otra, dificultando una posible inyección de SQL. Por ejemplo, una llamada que antes era:

http://miweb.com/noticia.php?id=30

pasa a ser, por ejemplo:

http://miweb.com/listado_de_noticias/30

Todo esto conseguido gracias a un pequeño fichero .htaccess similar a este:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^listado_de_noticias/([0-9]+) noticia.php?id=$1 [L,NC]
</IfModule>

Como vemos, por un lado oculta la url original y por otro restringe mediante el .htaccess la entrada de parámetros, en este caso, el id sólo puede ser un número entre 0 y 9, por lo que no podremos escribir nada del estilo:

http://miweb.com/listado_de_noticias/30+and+1=1

Otro caso diferente sería cuando la inyección no se realiza en un valor numérico, por ejemplo:

RewriteRule ^listado_de_noticias/([a-zA-Z0-9]+) noticia.php?id=$1 [L,NC]

En este caso, nos permite introdudir números y letras, pero tampoco podríamos inyectar código SQL ya que ni el espacio ni las comillas están permitidos:

http://miweb.com/listado_de_noticias/titulo’+and+’1’=’1

En resumen, todo varía en función de cómo esté configurado el .htaccess, al que por supuesto no tenemos acceso. Pero eso no es todo. Muchos administradores piensan que con esto la web ya está protegida a ataques de inyección SQL pero realmente el mod_rewrite es sólo una máscara ya que si el fichero PHP final (noticia.php en este caso) tenía problemas de inyección, los seguirá teniendo. Y si alguien llega a averiguar el nombre del fichero original, podrá acceder directamente sin necesidad de pasar por el mod_rewrite.

Sólo hay que echarle un poco de imaginación. Por ejemplo, buscar nombres similares a ver si hay suerte. Si la url es  http://miweb.com/listado_de_noticias/30 se pueden realizar búsquedas a ver si hallamos la página original:

http://miweb.com/listado_de_noticias.php?id=30
http://miweb.com/noticias.php?id=30
http://miweb.com/noticias.php?idnoticia=30
…..

Aunque parezca un trabajo de chinos, muchas veces da resultado.

Y si el mod_rewrite se ha aplicado sólo por mantener la seguridad (o mejorar el posicionamiento) y no viene unido a un cambio de estética o remodelación de la web, lo más probable es que podamos encontrar el nombre de algún fichero original mediante otras técnicas, por ejemplo:

  • Buscando en Google y demás buscadores un listado de las páginas indexadas de esa web, con la búsqueda:  ‘site:miweb.com inurl:.php’. Esto nos puede mostrar páginas antiguas que aún sigan indexadas.
  • Buscando con un spider el contenido de cada página de la web. Muchas veces se olvida cambiar una URL para que apunte a la nueva dirección en lugar de al fichero PHP
  • Buscando en Google enlaces hacia esa web, donde es posible que un link antiguo apunte a una noticia o cualquier otra sección de la web, con la búsqueda: ‘link:miweb.com’ o bien: site:.com «miweb.com» -site:miweb.com
  • Buscando en WayBack Machine, que guarda un histórico de muchísimas webs (150 billones … casi nada jeje) y además suele guardar una captura de toda la web cada mes, por lo que muy probablemante escontremos la estructura antigua.

Deja un comentario