Skip to content
Snippets Groups Projects
Commit bab4ba86 authored by Pierre Michiels's avatar Pierre Michiels
Browse files

exo 4,5 et 6 terminé

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