From bab4ba865ba7578fab4914e48bfb7cdbee76f726 Mon Sep 17 00:00:00 2001
From: Pierre Michiels <pierre.michiels.etu@univ-lille.fr>
Date: Wed, 3 Feb 2021 22:34:19 +0100
Subject: [PATCH] =?UTF-8?q?exo=204,5=20et=206=20termin=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 rendu.md      | 11 +++++++
 server_xss.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+)
 create mode 100755 server_xss.py

diff --git a/rendu.md b/rendu.md
index 13a6577..f0a2d02 100644
--- a/rendu.md
+++ b/rendu.md
@@ -49,12 +49,23 @@ Si le test échoue, je renvois une string indiquant une erreur 400. (mauvaise re
 ## Question 5
 
 * Commande curl pour afficher une fenetre de dialog. 
+´´´
+curl 'http://127.0.0.1:8080/' --data-raw "chaine=%3Cscript%3Ealert%28%22hello%22%29%3C%2Fscript%3E&submit=OK"
+´´´
 
 * Commande curl pour lire les cookies
+curl 'http://127.0.0.1:8080/' --data-raw "chaine=%3Cscript%3E%0D%0Adocument.cookie+%3D+%22username%3DJohn+Doe%22%3B+%0D%0Aalert%28document.cookie%29%3B%0D%0Adocument.location.replace%28%22http%3A%2F%2F127.0.0.1%3A8090%22%29%3B%0D%0A%3C%2Fscript%3E&submit=OK"
+
 
 ## Question 6
 
 Rendre un fichier server_xss.py avec la correction de la
 faille. Expliquez la demarche que vous avez suivi.
 
+La correction du serveur.py pour la faille xss est exactement la même que pour l'injection sql.
+On fait d'abord passer l'entrée utilisateur de l'input par un regex. (Ce qui échappe les caractères spéciaux).
+un regex spécial pour une faille xss est d'échapper la balise script ainsi: re.search("^<script>", postChaine) et de tester un if contraire ('!')
+pour à tout prix éviter d'injecter une balise <script> dans le code.
+Puis on exécute la requete sql avec un paramètre de type string sécurisé.
+
 
diff --git a/server_xss.py b/server_xss.py
new file mode 100755
index 0000000..0c0ee1e
--- /dev/null
+++ b/server_xss.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+
+import mysql.connector
+import cherrypy
+import config
+import re
+
+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)
+            #https://realpython.com/prevent-python-sql-injection/
+            postChaine = post["chaine"]
+            x = re.search("^[a-zA-Z0-9]+$", postChaine)
+
+            if x:
+                cursor.execute("INSERT INTO chaines (txt,who) VALUES(%s, %s)", (postChaine, cherrypy.request.remote.ip))
+                self.conn.commit()
+            else:
+                cursor.close()
+                return "Error 400, bad query\n"
+            
+
+        chaines = []
+        cursor.execute("SELECT txt,who FROM chaines");
+        for row in cursor.fetchall():
+            chaines.append(row[0] + " envoye par: " + 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