Skip to content
Snippets Groups Projects
Commit 4b9d8080 authored by Jérémy's avatar Jérémy
Browse files

réponse question 6

parent 03d00426
No related branches found
No related tags found
No related merge requests found
...@@ -31,13 +31,13 @@ Ce mécanisme n'est pas efficace : il suffit de changer la ligne ```<form method ...@@ -31,13 +31,13 @@ Ce mécanisme n'est pas efficace : il suffit de changer la ligne ```<form method
* Expliquez comment obtenir des informations sur une autre table * Expliquez comment obtenir des informations sur une autre table
**ATTENTION TODO : ne pas utiliser SELECT mais une autre commande (laquelle?) pour obtenir UNIQUEMENT les NOMS DES COLONNES de la table et pas les INFORMATIONS**
Le début de la requête SQL est ```INSERT INTO chaines (who, txt) VALUES ('```. Il est difficile de modifier le début de cette requête. Pour obtenir des informations sur une autre table, par exemple ```table```, il est possible combiner cette requête ```INSERT``` avec une requête ```SELECT```, ce qui permets d'insérer dans la table ```table``` des données obtenues dans la table ```table```. Le début de la requête SQL est ```INSERT INTO chaines (who, txt) VALUES ('```. Il est difficile de modifier le début de cette requête. Pour obtenir des informations sur une autre table, par exemple ```table```, il est possible combiner cette requête ```INSERT``` avec une requête ```SELECT```, ce qui permets d'insérer dans la table ```table``` des données obtenues dans la table ```table```.
*Exemple :* supposons que la table ```table``` ait deux colonnes : ```c1``` et ```c2```. On peut obtenir le contenu de ```c1```avec la requête ```',SELECT c1 FROM table) --```. Il suffit maintenant de combiner cette requête avec la requête ```INSERT``` afin d'insérer le contenu récupéré par ```SELECT``` dans ```chaines```. On a alors la requête suivante : ```INSERT INTO chaines (who,txt) VALUES ('',SELECT c1 FROM table) -- ```. *Exemple :* supposons que la table ```table``` ait deux colonnes : ```c1``` et ```c2```. On peut obtenir le contenu de ```c1```avec la requête ```',SELECT c1 FROM table) --```. Il suffit maintenant de combiner cette requête avec la requête ```INSERT``` afin d'insérer le contenu récupéré par ```SELECT``` dans ```chaines```. On a alors la requête suivante : ```INSERT INTO chaines (who,txt) VALUES ('',SELECT c1 FROM table) -- ```.
On peut répéter cette opération autant de fois que nécessaire pour afficher les informations contenues dans les différentes colonnes de ```table```. On peut répéter cette opération autant de fois que nécessaire pour afficher les informations contenues dans les différentes colonnes de ```table```.
Si l'on veut récupérer uniquement les noms des commandes de la table, on peut utiliser ````DESCRIBE table```. La requête serait alors ```INSERT INTO chaines (who,txt) VALUES ('',DESCRIBE table) --```.
## Question 4 ## Question 4
Pour corriger cette vulnérabilité, il faut utiliser des prepared statements et des query paramétrées. Pour corriger cette vulnérabilité, il faut utiliser des prepared statements et des query paramétrées.
...@@ -61,7 +61,6 @@ La requête et ce tuple sont donnés à la commande execute, qui va se charger d ...@@ -61,7 +61,6 @@ La requête et ce tuple sont donnés à la commande execute, qui va se charger d
## Question 6 ## Question 6
Rendre un fichier server_xss.py avec la correction de la La faille XSS à été corrigée en utilisant la fonction ```escape()``` du module ```html```. Cette fonction permet de transformer les caractères en ```<```, ```>``` et ```&```, notamment utilisés dans les balises HTML en chaînes n'étant pas interprétées par HTML. Il est préférable de réaliser le traitement à l'affichage des données plutot qu'a l'insertion. En effet, si les chaines insérées sont traitées par escape à l'insertion, celles-ci ne seront pas correctement affichées sur la page.
faille. Expliquez la demarche que vous avez suivi. (indice : 1 mot a ajouter)
#!/usr/bin/env python3
import mysql.connector
import cherrypy
import config
import html
class SafeApp(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(prepared = True)
if cherrypy.request.method == "POST":
requete = "INSERT INTO chaines (txt,who) VALUES(%s,%s)"
params = (post["chaine"],cherrypy.request.remote.ip)
print("req: [" + requete + "]")
print("chaine : "+post["chaine"])
cursor.execute(requete, params)
self.conn.commit()
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>" + escape(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.server.socket_host = '0.0.0.0'
cherrypy.quickstart(SafeApp())
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment