Vamos a explicar estas 2 tecnicas a la vez ya que son muy parecidas y estan muy relacionadas, ya que cuando hagamos un XSS estaremos haciendo a la vez un HTML Injection.
Por lo que para efectuar este tipo de vulnerabilidad vamos a irnos al apartado de OWASP 2017 -> Cross-Site-Scripting (XSS) -> Reflected (First Order) -> DNS Lookup
Y veremos algo tal que esto:
La funcionalidad legal de este apartado es que cuando nosotros metamos un dominio o IP nos haga una resolucion a dicho dominio o IP dandonos informacion sobre ello, por ejemplo si metemos www.google.com tendremos que ver algo asi:
Esta vulnerabilidad sucede cuando los programadores de alguna manera cuando crearon dicha pagina web, este apartado en concreto, cuando nosotros incluimos texto y este texto se refleja en la pagina web como podemos observar con www.google.com no llega a realizar una sanitizacion adecuada sobre ciertos caracteres que nosotros podremos meter y que son caracteres reservados para el lenguaje de HTML, con lo cual nosotros podremos incluir caracteres especiales como por ejemplo <>"'`, etc... las cuales estan incluidos en HTML y este mismo lo interpretara como un fragmento de codigo HTML por lo que lo representara como tal.
Y esto pasa cuando no es capaz de codificar dichos caracteres, escapar dichos caracteres de alguna manera para que no se interpreten como codigo HTML, yo puedo aprovechar esto para injectar codigo que lo que haga sea que cambie la apariencia de dicha pagina web.
Por lo que si ponemos lo siguiente:
Hostname/IP = <h1>canario</h1>
Veremos que el nombre canario se ve mucho mas grande, por lo que esta funcionando la injeccion de codigo (XSS):
De esta forma parece inofensivo, pero tambien se puede injectar codigo javascript por lo que esto ya va siendo mas ofensivo dependiendo de lo que hagamos:
Y si todo sale bien, deberemos de ver una alerta cuando lo enviemos, sabiendo que ya 100% es vulnerable este tipo de codigos XSS.
Ahora lo que vamos hacer es un HTML Injection siendo de forma ofensiva, con un paylaod que nos proporciona la pagina de Mutillidae pero cambiando algunas cosas:
La funcionalidad basica de lo que hace este payload es que al usuario le salta una alerta de que su cuenta a expirado y que tiene que insertar las credenciales de nuevo para lo que sea, dichas credenciales se envian a un servidor que nosotros queramos o tengamos para recibirlas por parte del atacante, pero como en este caso no tenemos ningun servidor, lo haremos de la siguiente forma:
La propia pagina de Mutillidae tiene por asi decirlo un apartado que actua como nuestro servidor del atacante para que lo que ponga el usuario llegue a ese apartado que nosotros hemos configurado, por lo que nos tendremos que ir a Data Capture Page -> View Captured Data:
Eso actua como nuestro servidor y donde podremos ver las credenciales capturadas, por lo que los cambios que realizaremos al payload serian los siguientes.
Primero quitar el localhost y poner la IP de la maquina donde esta corriendo Mutillidae que en mi caso seria la 192.168.5.177 y en la parte de lAction cambiaremos la URL para que le redirija al servidor que en nuestro caso es el Captured Data, por lo que pondremos algo como /src/index.php?page=captured-data.php quedando algo tal que asi el codigo:
Ahora nos volvemos a nuestro DNS Lookup, ponemos la palabra por ejemplo canario y con Burp Suite a la escucha enciamos la peticion para que la capture Burp Suite:
Teniendo la peticion capturada lo que tendremos que hacer sera codificar todo esto ya que hay saltos de linea, muchos caracteres, espacios, etc... Por lo que nos iremos al Decoder de Burp Suite, en el pegaremos el codigo y le daremos a la opcion de Encode as ... en tipo de URL viendose algo asi:
Pues todo esto lo tendremos que pegar sustituyendo la palabra canario por todo este tocho, quedando algo asi:
Y si ahora le damos a Forward veremos en la pagina lo siguiente:
El panel que comente donde pondra que la sesion a expirado y habra que volver a poner las credenciales, por lo que el usuario lo hara y esto llegara a nuestro servidor del atacante en la parte esa de la pagina de Mutillidae que mencione.
Metiendo las credenciales pondra esto otro:
Y aqui nos pondra Gracias ya puedes continuar, por lo que las credenciales ya las habriamos capturado, ahora solo tendremos que irnos al siguiente apartado para verlas:
Iremos a Data Capture Page -> View Captured Data -> y veremos las credenciales:
Con este tipo de tecnicas tambien se podria hacer un phishing en el que cuando piche en un link que le enviemos aparezca este popup y cuando meta las credenciales lleguen al servidor de atacante.
Pero especificamente este tipo de tecnica se le llama un Cross-Site-Scripting (XSS) - Reflected, pero uno mas interesante es el poder dejar ese codigo de forma permanente en la pagina para que aparezca ese popup cada vez que cualquier usuario ingrese en ese apartado a esto se le llama un Cross-Site-Scripting (XSS) - Persistent/Stored.
Para probar esto nos iremos al siguiente apartado de la pagina web:
OWASP 2017 -> Cross-Site-Scripting (XSS) -> Persistent (Second Order) -> Add to your blog.
En este apartado el funcionamiento legal es que nosotros podemos escribir un blog o un comentario el cual se va a quedar reflejado en la pagina web.
Pero como ya dije antes, si no esta bien sanitizadas las entradas de los caracteres especiales, podremos hacer un XSS o HTML Injection.
Si nosotros por ejemplo ponemos:
<h1>canario</h1>
Podremos ver que el texto se escribe mas grande por lo que funciona, pero no solo funciona eso, si no que se queda reflejado en la pagina web y cada vez que entre un usuario se le va a ejecutar eso por lo que los demas podrian ver eso mismo:
Por lo que vamos hacer lo mismo de antes, para que cada vez que un usuario ingrese en este apartado le aparezca el popup de meter las credenciales por que su cuenta a expirado.
Pondremos el Burp Suite a escuchar y una vez enviada la peticion, pondremos el codigo codificado reemplazando la palabra canario o lo que hayamos metido del popup, quedando algo asi:
Pero en el codigo tendremos que reemplazar todas las comillas simples (') por comillas dobles (") por que si no dara error.