VULNERABILIDADES DE APLICACIONES WEB: LA INCLUSIÓN LOCAL DE ARCHIVOS POR MEDIO DE COOKIES

19.01.2018 09:31
Algo que el desarrolllador podría no tener en cuenta es este caso un tanto especial de inclusión local de archivos, donde el nombre del archivo a incluir queda guardado en una cookie. Veamos el archivo "adelante.html", donde el usuario elige en qué idioma quiere manejarse dentro de la aplicación:
 
<html>
<form action="atras.php" method="get">
   <select name="idioma">
      <option value="castellano">Castellano</option>
      <option value="quechua">Quechua</option>
   </select>
   <input type="submit">
</form>
</html>
 
Siendo "atras.php" como sigue:
 
<?php
$idioma = $_GET['idioma'];
setcookie('idioma',$idioma,time() + (86400 * 7), "/", null, null, true);
header("location: final.php");
?>
 
El idioma elegido por el usuario se guarda como dato en una cookie y de acuerdo a él se incluirá castellano.php o quechua.php, como vemos en el archivo "final.php":
 
<?php
if ( isset( $_COOKIE['idioma'] ) ) {
   include( $_COOKIE['idioma'] . '.php' );
}
?>
 
Sin embargo si un pirata informático cliqueara en "Inspeccionar elemento" en "adelante.html" y cambiara "castellano" por "/subdirectorio/shell/" (suponiendo que en el directorio de estos archivos existiera "/subdirectorio/shell.php") y luego cliqueara en enviar, se ejecutaría el código de "shell.php".
 
 
El archivo "final.php" debió ser así:
 
<?php  
$idiomas = array('castellano', 'quechua');  
if(isset($_COOKIE['idioma']) and in_array($_COOKIE['idioma'], $idiomas)) {  
  include $idiomas[array_search($_COOKIE['idioma'], $idiomas)] . '.php';  
} else  
  die('No se ha especificado la página a mostrar o no existe en el servidor');  
?>
 
Además sugerimos no usar nombres tan obvios para las cookies y encriptar fuertemente sus valores.