From cbe6bcd83b252c06ca206843d582944e3547ea84 Mon Sep 17 00:00:00 2001
From: Lipari Giuseppe <giuseppe.lipari@univ-lille.fr>
Date: Wed, 3 Feb 2021 14:22:21 +0100
Subject: [PATCH] maj pour le tp2

---
 README.md  | 21 +++++++++++----------
 config.py  |  6 +++---
 serveur.py |  7 ++++---
 3 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index 1f7a071..0abeb16 100644
--- a/README.md
+++ b/README.md
@@ -14,14 +14,6 @@ Vous pouvez aussi utiliser l'image OVA disponible sur: https://nextcloud.univ-li
 
 ## Préparation
 
-### Récupération du dépôt git
-
-Pour récupérer le dépôt git, ouvrez un terminal et placez vous dans le dossier de votre choix, puis tapez la commande suivante:
-
-```
-git clone https://gitlab-etu.fil.univ-lille1.fr/ballabriga/applipythonvulnerable
-```
-
 Dans ce dépôt, vouz trouverez le fichier `serveur.py` contenant le source python du serveur vulnérable.
 
 ### Préparation d'un environnement virtuel Python3
@@ -70,7 +62,9 @@ Pour créer la table qui servira à l'application, connectez vous à votre base
 ```
 CREATE TABLE chaines (
 	id int NOT NULL AUTO_INCREMENT, 
-	txt varchar(255) not null, PRIMARY KEY(id)
+	txt varchar(255) not null, 
+	who varchar(255) not null,
+	PRIMARY KEY(id)
 );
 ```
 
@@ -108,6 +102,8 @@ Ensuite, allez sur `http://localhost:8080` avec votre navigateur, et testez le f
  * Regardez le source de la page web
  * Regardez le source du programme serveur.py 
 
+L'application permet d'inserer des chaines dans une table de la base de données (dans la colonne txt), tout en loggant l'adresse IP de la personne ayant envoyé cette chaine (dans la colonne who)
+
 Vous pouvez regarder la documentation de CherryPy sur https://cherrypy.org/ et la documentation du connecteur MySQL python sur https://dev.mysql.com/doc/connector-python/en/
 
 ### Trouver une première vulnérabilité (injection SQL)
@@ -122,6 +118,11 @@ requete = "SELECT * FROM table WHERE champ='" + valeur "';"
 Si la valeur donnée par l'utilisateur est: `'; <autre commande SQL>; --`, alors la variable requete
 aura la valeur suivante: `SELECT * FROM table WHERE champ=''; <autre commande SQL>; --';` et l'autre commande SQL sera executée.
 
+Sans rajouter de deuxieme commmande à executer, il est possible en général d'altérer la requete SQL pour pouvoir faire des comportements qui n'ont pas été prévus.
+
+Ainsi, par exemple, si la valeur donnée par l'utilisateur est `' OR 1=1 --`, alors
+la requete SQL executée sera: `SELECT * FROM table WHERE champ='' OR 1=1`, ce qui renverra toute les données de la table.
+
 Examinez le source `serveur.py` pour trouver une vulnérabilité d'injection SQL. Pour vous aider, vous pouvez aussi afficher la requête MySQL en rajoutant un `print(requete)` dans la méthode `index`.
 
 Examinez le source de la page web depuis votre navigateur. Un mécanisme a été mis en place pour tenter d'empecher l'exploitation de la vulnérabilité. 
@@ -139,7 +140,7 @@ Essayez d'insérer dans la base de données des chaines qui comportent des carac
 
 #### Question 3 : Exploitation de la vulnérabilité 
 
-En utilisant `curl`, et si besoin après avoir révisé le cours sur les injections SQL, réalisez une injection SQL qui va effacer tout le contenu de la table. Vérifiez ensuite que cela a fonctionné et que votre table est vide.
+En utilisant `curl`, et si besoin après avoir révisé le cours sur les injections SQL, 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.
 
 L'exploitation d'injections SQL n'est pas limitée à la destruction de données. En supposant l'existence d'une autre table dans la base, imaginez un moyen d'utiliser cette faille d'injection SQL pour obtenir des informations sur les données de cette autre table (il n'est pas demandé de l'implémenter, mais d'expliquer une approche envisageable)
 
diff --git a/config.py b/config.py
index 941e1c8..7c9fd2f 100644
--- a/config.py
+++ b/config.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
 DB_HOST="localhost"
-DB_USER="pouet"
-DB_NAME="isitp"
-DB_PASS="pouet"
+DB_USER="isi"
+DB_NAME="isi"
+DB_PASS="toto"
diff --git a/serveur.py b/serveur.py
index ed1a5ba..f81eaf9 100755
--- a/serveur.py
+++ b/serveur.py
@@ -12,14 +12,15 @@ class VulnerableApp(object):
     def index(self, **post):
         cursor = self.conn.cursor()
         if cherrypy.request.method == "POST":
-            requete = "INSERT INTO chaines (txt) VALUES(\"" + post["chaine"] + "\");"
+            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 FROM chaines");
+        cursor.execute("SELECT txt,who FROM chaines");
         for row in cursor.fetchall():
-            chaines.append(row[0])
+            chaines.append(row[0] + " envoye par: " + row[1])
 
         cursor.close()
         return '''
-- 
GitLab