Hoy vamos a hablar de los Cross Site Scripting (XSS), que consiste en inyectar codigo malicioso aprovechandonos de una vulnerabilidad en una web para su posterior ejecución en el servidor o en el cliente.
¿Qué se podría aprovechar inyectando código?
Pues podremos realizar un deface de la página web, ataques phishing, robo de cookies, redirigir a otra web que infecte con malware, etc.
Los ataques XSS se dividen en 2 tipos:
-Directo (Persistente): Estos son los que se encuentran en foros, libros de visitas y webs que dispongan de formularios. Dicho ataque, inyecta nuestro codigo en la web, y cada cliente que acceda a la página donde se ha inyectado, su navegador ejecutará las instrucciones de nuestro codigo.
-Indirecto (Reflejado): Este tipo de ataque XSS no inyecta el codigo en la propia web, si no que se ejecuta en el propio navegador del cliente sin afectar al servidor. Para eso debemos hacer que el cliente entre en la url maliciosa y suelen encontrarse en buscadores de texto.
Imaginemos una web con un buscador de texto. Este buscador esta escrito de la siguiente manera:
<form action="vulnerable.php" method="GET">
<input id="q" name="q" type="text">
<input type="submit">
</form>
Si escribimos en el buscador la palabra "hi" reaccionará de la siguiente manera:El resultado de la busqueda en el codigo fuente sería el siguiente:
<body>Sorry, we could not find any results for: hi</body>
Bien. ¿Que pasaría si intentasemos cerrar la etiqueta <body> antes
de mostrar nuestra palabra, por ejemplo, escribiendo "</hi"? Pues en
teoria al no cerrar la etiqueta, la siguiente parte de nuestro codigo
sería interpretado por el servidor web y lo mostraría como una parte más
del codigo fuente. Veamos que sucede:
Bingo!! ya hemos conseguido inyectar código, ahora por ejemplo
podríamos escribir un poco de javascript para, por ejemplo, sacar un
simple pop-up, pero antes de escribirlo debemos cerrar la etiqueta que
hemos abierto de la siguiente manera:
</><script>alert("hi")</script>
Perfecto!! ya tenemos nuestro Cross Site Scripting de tipo indirecto, es decir, que sólo afecta a nuestro navegador.
Si volvemos a hacer otra consulta veremos que no guarda nuestro codigo en el servidor.
Ahora para lanzar este "ataque" a nuestra victima, tendríamos que pasarle la url para que su navegador ejecutase el codigo.
¿Y qué pasa con el persistente?
No os preocupéis, vamos a hacer una Proof of Concept para que veáis que
la idea es la misma, salvo que ahora, todo el codigo que vayamos a
introducir, sí se quedará guardado en el servidor y todo el que acceda a
esa pagina ejecutará nuestro código.
Tenemos el siguiente formulario de registro:
<form name="search" method="POST" action="register.php">
Name: <input type="text" name="name" /><br>
Last Name: <input type="text" name="last_name" /><br>
Username: <input type="text" name="username" /><br>
Password: <input type="text" name="password" /><br>
<input type="hidden" name="reg" value="1" />
<input type="submit" value="Register" />
</form>
Mediante POST se envia los datos introducidos en esos 4 campos, y los datos los leeremos desde Users.php, que como vemos está más abajo:
Bien,
ahora haremos lo mismo que el ataque anterior, introducimos todos los
datos pero intentando cerrar el campo Username para introducir nuestro
código:
/><script>alert('XSS');</script>
Ya tenemos nuestro XSS Persistente.
Si queréis probar vosotros mismos, podeis probar en: https://hack.me/s/
Espero que les haya gustado.
0 comentarios:
Publicar un comentario