Je vais modifier le code pour remplacer le formulaire POST par une page avec du JavaScript qui modifie le cookie côté
client directement dans le navigateur, puis redirige vers la page /secret. Cela simule encore mieux une attaque
réaliste où un attaquant utilise un script ou les outils de développement pour injecter un cookie volé.
Voici le code mis à jour :
from flask import Flask, request, render_template_string, session, redirect, url_for
import secrets
app = Flask(__name__)
app.secret_key = secrets.token_hex(16) # Clé secrète pour signer les sessions
# Simulation d'une base de données utilisateurs
users = {
"alice": "password123"
}
# Page HTML de base avec login
LOGIN_PAGE = """
<h1>Connexion</h1>
<form method="POST">
Utilisateur: <input type="text" name="username"><br>
Mot de passe: <input type="password" name="password"><br>
<input type="submit" value="Se connecter">
</form>
{% if error %}
<p style="color: red">{{ error }}</p>
{% endif %}
"""
# Page d'accueil après connexion
HOME_PAGE = """
<h1>Bienvenue {{ username }}</h1>
<p>Votre Session ID: {{ session_id }}</p>
<a href="/secret">Voir votre secret</a><br>
<a href="/logout">Déconnexion</a>
"""
# Page du secret
SECRET_PAGE = """
<h1>Votre Secret</h1>
<p>Secret: {{ secret }}</p>
<a href="/">Retour</a>
"""
# Page de hijacking avec JavaScript
HIJACK_PAGE = """
<h1>Session Hijacking</h1>
<p>Entrez le Session ID volé :</p>
<input type="text" id="session_id" style="width: 300px;" placeholder="Collez le Session ID ici"><br><br>
<button onclick="hijackSession()">Hijacker la session</button>
<p id="error" style="color: red;"></p>
<script>
function hijackSession() {
const sessionId = document.getElementById('session_id').value.trim();
if (!sessionId) {
document.getElementById('error').innerText = 'Veuillez entrer un Session ID';
return;
}
// Modifier le cookie côté client
document.cookie = `session=${encodeURIComponent(sessionId)}; path=/`;
// Rediriger vers la page secret
window.location.href = '/secret';
}
</script>
"""
@app.route('/', methods=['GET', 'POST'])
def login():
if 'username' in session:
return render_template_string(HOME_PAGE,
username=session['username'],
session_id=request.cookies.get('session'))
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and users[username] == password:
session['username'] = username
return redirect(url_for('login'))
return render_template_string(LOGIN_PAGE, error="Mauvais identifiants")
return render_template_string(LOGIN_PAGE)
@app.route('/secret')
def secret():
if 'username' not in session:
return "Vous devez être connecté", 401
secret = f"Secret spécial pour {session['username']}"
return render_template_string(SECRET_PAGE, secret=secret)
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
# Endpoint pour le hijacking avec JavaScript
@app.route('/hijack')
def hijack():
return render_template_string(HIJACK_PAGE)
if __name__ == '__main__':
app.run(debug=True, port=5000)-
Suppression du POST :
- L’endpoint
/hijackne gère plus POST. Il renvoie simplement une page HTML avec un script JavaScript pour GET.
- L’endpoint
-
Page de Hijacking avec JavaScript :
- La variable
HIJACK_PAGEcontient maintenant :- Un champ
<input>pour entrer lesession_id. - Un bouton qui appelle la fonction
hijackSession()au clic. - Un élément
<p>pour afficher les erreurs.
- Un champ
- Le script JavaScript :
- Récupère la valeur du champ avec
document.getElementById('session_id').value. - Vérifie qu’elle n’est pas vide (
trim()enlève les espaces inutiles). - Définit le cookie avec
document.cookie =session=${encodeURIComponent(sessionId)}; path=/`` (lepath=/garantit que le cookie est disponible pour toutes les routes). - Redirige vers
/secretavecwindow.location.href.
- Récupère la valeur du champ avec
- La variable
-
Côté Client :
- Tout se passe dans le navigateur. Le serveur ne fait que servir la page ; c’est le JavaScript qui modifie le cookie et déclenche la redirection.
-
Lancer le serveur :
python nom_du_fichier.py
-
Connexion Légitime :
- Va à
http://localhost:5000/, connecte-toi avecalice/password123. - Note le Session ID affiché (ex:
.eJwl...).
- Va à
-
Hijacking :
- Ouvre un nouveau navigateur ou une fenêtre anonyme (pour partir d’une session vierge).
- Va à
http://localhost:5000/hijack. - Colle le
session_iddans le champ texte. - Clique sur "Hijacker la session".
- Le JavaScript modifiera le cookie dans ton navigateur et te redirigera vers
http://localhost:5000/secret.
-
Résultat Attendu :
- Tu verras la page
/secretavec "Secret spécial pour alice", prouvant que le cookie volé a été utilisé pour hijacker la session.
- Tu verras la page
- Le JavaScript modifie le cookie
sessioncôté client, ce qui est exactement ce qu’un attaquant pourrait faire avec les outils de développement du navigateur (ex: modifier un cookie dans l’onglet "Application") ou via un script malveillant (XSS). - Lors de la redirection vers
/secret, Flask reçoit ce cookie dans l’en-tête de la requête, le valide, et restaure la session associée.
- Erreur 401 : Si tu obtiens "Vous devez être connecté" après redirection, vérifie que le
session_idest copié intégralement (point initial inclus, pas d’espaces). Ouvre les outils de développement (F12) > onglet " Application" > "Cookies" pour confirmer quesessionest bien défini. - Pas de redirection : Si rien ne se passe, assure-toi que JavaScript est activé et vérifie la console du navigateur pour d’éventuelles erreurs.
- Cette approche est très proche d’une attaque réelle où un attaquant injecterait un cookie via un script ou manuellement dans son navigateur pour usurper une session.
Si tu veux ajouter des fonctionnalités (ex: vérifier le cookie avant redirection) ou explorer autre chose, fais-moi signe !