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