Deserialización Insegura Python
Pagina Vulnerable Deserialización Insegura en Python
import pickle
import base64
from flask import Flask, request, make_response, render_template, redirect, url_for
app = Flask(__name__)
# Base de datos de usuarios (simulada)
users = {
"admin": "admin123",
"user1": "password1",
"user2": "password2"
}
# Clase del usuario (con deserialización insegura)
class User:
def __init__(self, username, role):
self.username = username
self.role = role
def __str__(self):
return f"{self.username} ({self.role})"
@app.route("/")
def index():
# Obtener la cookie
session_cookie = request.cookies.get("session")
if session_cookie:
try:
# Deserializar la cookie (VULNERABILIDAD)
user = pickle.loads(base64.b64decode(session_cookie))
except Exception as e:
user = f"Error deserializando: {e}"
else:
user = "Invitado"
return render_template("index.html", user=user)
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
username = request.form["username"]
password = request.form["password"]
if username in users and users[username] == password:
# Crear el objeto de usuario
user = User(username, "admin" if username == "admin" else "user")
# Serializar el objeto inseguramente con pickle
session_data = base64.b64encode(pickle.dumps(user)).decode()
# Crear la cookie con la sesión serializada
response = make_response(redirect(url_for("index")))
response.set_cookie("session", session_data)
return response
else:
return "Credenciales inválidas", 403
return render_template("login.html")
if __name__ == "__main__":
app.run(debug=True)
Generar Payload Serializado en Base64
Enviar Payload al servidor


Last updated