Skip to content
Snippets Groups Projects
Commit cbe6bcd8 authored by Giuseppe Lipari's avatar Giuseppe Lipari
Browse files

maj pour le tp2

parent 84275166
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
#!/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"
......@@ -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 '''
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment