VULNERABILIDADES DE APLICACIONES WEB: LA IMPORTANCIA DE CONOCER EL FUNCIONAMIENTO DEL NAVEGADOR

14.01.2018 23:44
A medida que los programadores previenen mejor las inyecciones de HTML, los hackers buscan lugares menos obvios donde inyectar código, por ejemplo entre las etiquetas <title></title> de la parte superior del archivo .html, delimitada por las etiquetas <head></head> .
 
Vemaos el siguiente ejemplo:
 
El archivo adelante.html es el siguiente:
 
<html><head></head>
<body>
<body>
   <form method="get" action="atras.php">
        Ingrese el término a buscar: <input type="text" name="buscar">
        <input type="submit" name="subir_btn" value="Enviar" />
   </form>
</body>
</html>
 
siendo atras.php
 
<html>
<head>
<title><?php echo $_GET['buscar']; ?></title>
</head>
<body>
Búsqueda: <?php echo strip_tags($_GET['buscar']); ?>
</body>
</html>
 
Veremos que si ingresamos un término en "adelante.html", el mismo se verá reflejado en el cuerpo de "atras.php" como también en su título. 
Si en la casilla de búsqueda "adelante.html" ingresamos los siguiente:
 
"</title></h1>Esto está siendo inyectado en el cuerpo del archivo</h1>", veremos que efectivamente aparecerá en el cuerpo del archivo. ¿Por qué? Al cerrar el título con la etiqueta </title> y al añadir <h1>texto</h1> estaremos incrustando código HTML malformado entre las etiquetas <head></head>. Entre las mismas sólo son aceptadas las siguientes etiquetas: <title>; <base>; <link>; <style>; <meta>; <script>: <noscript>; <command> y sus respectivas etiquetas de cierre. El navegador intentará subsanar la malformación de código imprimiendo todo en el cuerpo del mensaje, que es donde aparecerá la inyección HTML.
 
Hemos probado el ataque en tres navegadores diferentes y funcionó igual en todos. Claro que se podría inyectar código desde el título al cuerpo del mensaje incluso sin la característica del navegador mencionada pero quisimos resaltar la importancia de conocer todo el entorno de la aplicación web, no sólo la aplicación propiamente dicha.
 
El ataque se previene usando strip_tags() también en el título, no solo en el cuerpo del archivo.