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.