From 03f24acc6cf2e99a95f6a00b3ca55f5b9c59b861 Mon Sep 17 00:00:00 2001
From: "martin.birlouez.etu" <Monopolie/Patate*821>
Date: Thu, 27 Jan 2022 20:30:10 +0100
Subject: [PATCH] Rendu final

---
 rendu.md       | 20 +++++++++-----
 serveur.py     |  1 +
 serveur_xss.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+), 7 deletions(-)
 create mode 100644 serveur_xss.py

diff --git a/rendu.md b/rendu.md
index c7dce8d..de776f8 100644
--- a/rendu.md
+++ b/rendu.md
@@ -34,11 +34,11 @@ Le script Js ne peut donc jammais trouver le chanp a vérifier.
 
 * Réalisez une injection SQL qui insérer une chaine dans la base de données, tout en faisant en sorte que le champ who 
 * soit rempli avec ce que vous aurez décidé (et non pas votre adresse IP). Verifiez que cela a fonctionné ensuite.
-curl -X POST -F "chaine=Hey','8.8.8.8') #" localhost:8080
+>curl -X POST -F "chaine=Hey','8.8.8.8') #" localhost:8080
 
 * Expliquez comment obtenir des informations sur une autre table
 Si ici a la place de la chaine on ajoute une requette par exemple :
-curl -X POST -F "chaine=Drop','8.8.8.8'); DELETE chaine WHERE 1=1 #" localhost:8080
+>curl -X POST -F "chaine=Drop','8.8.8.8'); DELETE chaine WHERE 1=1 #" localhost:8080
 
 
 ## Question 4
@@ -55,13 +55,19 @@ une verification par la librairei python.
 
 ## Question 5
 
-* Commande curl pour afficher une fenetre de dialog. 
+* Commande curl pour afficher une fenetre de dialog.  
+>curl -X POST -F "chaine=','\<script\>alert(\'Hi!\')\</script\>') #" localhost:8080  
 
-* Commande curl pour lire les cookies
+Cette fenetre insert en Sql la balise script et son contenut qui est ducoup interpréter a l'affichage.  
 
-## Question 6
+* Commande curl pour lire les cookies  
+
+>curl -X POST -F "chaine=','\<script\>document.location=\'https://google.fr\'\</script\>') #" localhost:8080
 
-Rendre un fichier server_xss.py avec la correction de la
-faille. Expliquez la demarche que vous avez suivi.
+ien sur ici a la place de google.fr on aurat l'adresse de notre site d'aspirateur a cookies.
 
+## Question 6
 
+On va appliquer le html.escape pour remplacer les caractére html [&,<,>] en une cahine sure comme rien.
+Nous réaliserons cette verification a l'affichage car c'est l'affichage du HTML et don sont interprétation par le 
+navigateur qui pose probléme.
diff --git a/serveur.py b/serveur.py
index f81eaf9..2f98f3c 100755
--- a/serveur.py
+++ b/serveur.py
@@ -24,6 +24,7 @@ class VulnerableApp(object):
 
         cursor.close()
         return '''
+        
 <html>
 <head>
 <title>Application Python Vulnerable</title>
diff --git a/serveur_xss.py b/serveur_xss.py
new file mode 100644
index 0000000..324fcff
--- /dev/null
+++ b/serveur_xss.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+import html
+
+import mysql.connector
+import cherrypy
+import config
+
+
+class VulnerableApp(object):
+    def __init__(self):
+        self.conn = mysql.connector.connect(host=config.DB_HOST, user=config.DB_USER, database=config.DB_NAME,
+                                            password=config.DB_PASS)
+
+    @cherrypy.expose
+    def index(self, **post):
+        cursor = self.conn.cursor()
+        if cherrypy.request.method == "POST":
+            requete = "INSERT INTO chaines (txt,who) VALUES('" + post[
+                "chaine"] + "','" + cherrypy.request.remote.ip + "')"
+            print("req: [" + requete + "]")
+            cursor.execute(requete)
+            self.conn.commit()
+
+        chaines = []
+        cursor.execute("SELECT txt,who FROM chaines");
+        for row in cursor.fetchall():
+            chaines.append(html.escape(row[0]) + " envoye par: " + html.escape(row[1]))
+
+        cursor.close()
+        return '''
+
+<html>
+<head>
+<title>Application Python Vulnerable</title>
+</head>
+<body>
+<p>
+Bonjour, je suis une application vulnerable qui sert a inserer des chaines dans une base de données MySQL!
+</p>
+
+<p>
+Liste des chaines actuellement insérées:
+<ul>
+''' + "\n".join(["<li>" + s + "</li>" for s in chaines]) + '''
+</ul>
+</p>
+
+<p> Inserer une chaine:
+
+<form method="post" onsubmit="return validate()">
+<input type="text" name="chaine" id="chaine" value="" />
+<br />
+<input type="submit" name="submit" value="OK" />
+</form>
+
+<script>
+function validate() {
+    var regex = /^[a-zA-Z0-9]+$/;
+    var chaine = document.getElementById('chaine').value;
+    console.log(regex.test(chaine));
+    if (!regex.test(chaine)) {
+        alert("Veuillez entrer une chaine avec uniquement des lettres et des chiffres");
+        return false;
+    }
+    return true;
+}
+</script>
+
+</p>
+</body>
+</html>
+'''
+
+cherrypy.quickstart(VulnerableApp())
+
-- 
GitLab