Académique Documents
Professionnel Documents
Culture Documents
TELECOMMUNICATIONS
Le Top 10 de l’OWASP change fréquemment, mais vaut toujours la peine d’être examiné.
Les préoccupations incluses dans cette liste sont parmi les plus courantes et les plus
alarmantes dans le monde numérique d’aujourd’hui.
1
II. Définition de l’attaque par injection
L’attaque par injection consiste en l’insertion de code dans un programme ou une application
Web. Ce faisant, le cybercriminel tente de changer le cours d’exécution de sa cible, ce qui
peut engendrer une multitude de conséquences, telle la propagation de logiciels malveillants
ou encore une attaque par déni de service.
2
C'est par exemple le cas lorsque les informations de connexion sont envoyées via un
formulaire Web pour permettre à un utilisateur d'accéder à un site. Généralement, ce type de
formulaire Web est conçu pour accepter seulement des types de données spécifiques, tels que
le nom et/ou le mot de passe. Lorsque ces informations sont ajoutées, elles sont vérifiées par
rapport à une base de données et, si elles correspondent, l'utilisateur est autorisé à entrer. Dans
le cas contraire, l'accès est refusé.
Des problèmes potentiels peuvent survenir, car la plupart des formulaires Web ne disposent
d'aucun moyen pour arrêter la saisie d'informations supplémentaires sur les formulaires. Les
pirates peuvent exploiter cette faille et utiliser les boîtes de saisie du formulaire pour envoyer
leurs propres demandes vers la base de données. Cela pourrait potentiellement leur permettre
d'effectuer plusieurs types d'activités malveillantes, allant du vol de données sensibles à la
manipulation d'informations de la base de données à leurs propres fins.
II.2.2. Exemple d’injection SQL
3
On va également utiliser Owasp Zap un outil pratique qui identifie automatiquement les
vulnérabilités de sécurité des applications Web pendant le développement et les tests.
➢ Configuration de notre base de données :
Démarrage de WAMP
4
Pour héberger notre application on crée un dossier test dans C:\wamp\www
<!DOCTYPE html>
<html>
<style>
input[type=text], input[type=password]{
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
input[type=submit] {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type=submit]:hover {
background-color: #45a049;
}
div {
width: 50%;
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
}
</style>
5
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Test d'injections</title>
</head>
<body>
<h1>Formulaire de connexion</h1>
<div>
<form action="traitement.php" method="post">
traitement.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Code pour traiter la soumission du formulaire
$username = $_POST['username'];
$password = $_POST['password'];
// Exécution de la requête
$result = $conn->query($query);
6
if ($result && $result->rowCount() > 0){
// Utilisateur authentifié
echo "Bienvenue, $username !";
} else {
// Authentification échouée
echo "Nom d'utilisateur ou mot de passe incorrect.";
}
// Fermeture de la connexion
$conn = null;
?>
On ouvre maintenant un onglet pour s’authentifier avec un compte existant avec l’url :
localhost/test
On renseigne un login et un mot de passe pour se connecter.
7
On clique sur se connecter
8
III.1. Concepts et caractéristiques clés du scanner ZAP
Analyse active
L’analyse active utilise des attaques connues pour identifier les vulnérabilités potentielles, ce
qui signifie qu’elle ne peut trouver que des vulnérabilités spécifiques. Les analyses de
vulnérabilité actives ou automatiques ne peuvent pas trouver d’erreurs dans la logique de
l’application. Cela n’est possible que lors d’un audit manuel.
Analyse passive
Par défaut, ZAP analyse les requêtes HTTP et toutes les réponses envoyées et reçues de votre
application. L’analyse passive n’affecte pas leur contenu. On peut ajouter des balises ou des
alertes pour vous informer de toute erreur potentielle. Bien que cette option soit activée par
défaut, il est également possible de la configurer.
OWASP ZAP Fuzzer
OWASP ZAP permet d’utiliser un fuzzer qui envoie de nombreuses données inattendues ou
incorrectes à une application testée. On peut créer nos propres charges utiles, utiliser l’une des
charges utiles intégrées ou télécharger les modules complémentaires de charges utiles fournis
par la communauté ZAP.
API OWASP ZAP
OWASP ZAP fournit une API qui accepte JSON, XML et HTML. Les fonctionnalités de
l’API sont expliquées sur une page Web, en spécifiant que la valeur par défaut autorise
uniquement la machine exécutant ZAP à se connecter à l’API. Toutefois, on peut utiliser les
options de configuration pour autoriser d’autres machines à contacter l’API.
Test WebSocket
Les WebSockets sont très répandus dans toutes les applications. ZAP permet d’intercepter,
d’analyser ou de falsifier facilement le trafic WebSocket entre le client et le serveur. On peut
accéder à l’éditeur de messages WebSocket en accédant au menu ZAP, en choisissant Outils,
puis en sélectionnant Éditeur de message WebSocket. L’éditeur permet de falsifier le
message Direction, Opcodes ou WebSocket avant qu’il ne soit renvoyé au serveur.
Araignée JAX
ZAP permet d’effectuer un spidering AJAX lors d’un test d’intrusion pour identifier les
requêtes sur une application Web riche en AJAX. Cet outil inclut des paramètres de
configuration tels que la profondeur maximale d’analyse, la durée maximale, les états
d’analyse maximaux et d’autres options pour nous aider à empêcher l’analyse infinie.
Gestion des stratégies d’analyse
ZAP permet de composer une stratégie d’analyse en fonction des exigences spécifiques de
chaque application. On peut trouver le Gestionnaire de stratégies d’analyse sous la barre de
menu.
Marché ZAP
9
ZAP Marketplace comprend des add-ons gratuits et open source écrits par l’équipe ZAP ainsi
que par la communauté. Ces modules complémentaires permettent d’étendre les
fonctionnalités d’une implémentation ZAP..
III.2. Composants clés de l’interface utilisateur de bureau
L’interface utilisateur du bureau de ZAP est composée des éléments suivants :
1. Barre de menus : permet d’accéder aux outils manuels et automatisés de ZAP.
2. Barre d’outils : permet d’accéder facilement aux fonctionnalités ZAP couramment
utilisées.
3. Fenêtre de l’arborescence (Tree Window) : affiche l’arborescence Scripts
et l’arborescence Sites.
4. Fenêtre Espace de travail : affiche les réponses, les scripts et les demandes et permet
de les modifier.
5. Fenêtre d’informations : affiche les détails des outils manuels et automatisés.
6. Pied de page – affiche un résumé de toutes les alertes et l’état de tous les principaux
outils automatisés.
1
2
10
Après avoir cliqué sur le bouton Attaquer, ZAP commence à explorer l’application Web avec
son araignée, en analysant passivement chaque page qu’elle trouve. Ensuite, ZAP utilise
l’analyseur actif pour attaquer toutes les pages, paramètres et fonctionnalités découverts.
Après avoir lancer l’attaque, on attend que la jauge de progression du scan atteigne les 100%.
Le scan terminé, on se rend dans l’onglet Alertes pour voir les vulnérabilités détectées.
Comme on le voit sur la capture ci-dessus Zap détecte plusieurs types de failles dont
l’injection SQL (2) avec un niveau d’alerte élevé ( drapeau rouge). Les autres failles seront
traitées dans d’autres supports.
11
Regardons de plus près :
Le paramètre « password » défini dans notre code traitement.php est vulnérable à une attaque
ZAP' OR '1'='1' -- .
Il en est de même pour le paramètre « username »
12
III.3. Test d’intrusion par injection SQL (Authentication bypass)
Test d’injection avec notre formulaire de connexion.
Puisque Zap nous dit que les champs username et password sont vulnérable. Dans ce cas on
va se connecter avec le compte ‘ismaila’ et donner un mot passe « ZAP' OR '1'='1' -- »
On clique Se connecter.
13
On voit qu’on s’est connecté sans fournir de mot passe correcte (on a injecté du code ).
Recommençons le test en injectant le code dans username
Ceci montre que même si notre application fonctionne correctement, elle reste quand même
vulnérable aux injections sql.
Le problème vient de la requête utilisée pour authentifier les utilisateurs.
// Requête vulnérable aux injections SQL
$query = "SELECT * FROM zap_users WHERE username = '$username' AND password = '$password'";
14
En insérant la tautologie : ZAP' OR '1'='1' -- (injection de type "always true") dans
password.
La requete deviendra :
SELECT * FROM zap_users WHERE username = '$username' AND password = ZAP' OR
'1'='1' -- '
Cette tautologie est utilisée lors de l’évaluation de la requête SQL qui, par conséquent, est
toujours valide, quel que soit le nom d’utilisateur, ce qui permet de contourner le processus
d’authentification.
On peut également essayer d’autres requêtes : Suppression, Modification etc.
Exemple de modification de mot de passe d’un utilisateur
'; UPDATE zap_users SET password='nepasseraplus' WHERE username='ismaila'; --
Si on renseigne cette requête dans le champ nom d’utilisateur du formulaire, cela va modifier
le mot de passe de connexion de l’utilisateur « ismaila » en « nepasseraplus ».
Cela démontre le danger de construire des requêtes SQL en insérant directement des valeurs
d'entrée sans échapper correctement les caractères spéciaux.
Pour éviter cela, il est essentiel d'utiliser des requêtes préparées ou de valider les entrées. De
cette manière, les valeurs seront traitées de manière sécurisée et les attaques d'injection SQL
seront prévenues.
III.4. Correctif pour éviter les attaques de types injections SQL
Il convient d'adopter un ensemble de techniques simples pour empêcher les vulnérabilités
d'injection SQL. Ces techniques peuvent être utilisées avec pratiquement n’importe quel type
de langage de programmation avec n’importe quel type de base de données.
Défenses principales :
❖ Option 1 : Utilisation d’instructions préparées (avec des requêtes paramétrées)
❖ Option 2 : validation des entrées
❖ Option 3 : Échappement de toutes les entrées fournies par l’utilisateur
Dans l’exemple qui va suivre nous allons utiliser les requêtes préparées pour éviter les
attaques d’injections SQL.
En revoyant notre code il suffit juste d’ajouter les lignes suivantes et de supprimer l’ancienne
requête :
15
Voici le correctif
// Requête préparée :::::: Correctif injections SQL
$query = "SELECT * FROM zap_users WHERE username = :username AND password = :password";
$stmt = $conn->prepare($query);
$stmt->execute([
'username' => $username,
'password' => $password
]);
Maintenant pour s’assurer effectivement que l’applications n’est plus vulnérable aux
injections SQL on relance ZAP :
16
Il n’a plus détecté les failles
de type injection SQL
Au niveau des alertes Zap ne signale plus que notre application est vulnérable aux injections
SQL.
Reprenons les tests d’injections
En cliquant sur
On s’aperçoit affectivement qu’il n’est plus possible d’effectuer des injections SQL sur notre
application.
17
IV. Les injections LDAP
L’injection LDAP est une attaque utilisée pour exploiter les failles des applications Web qui
construisent des instructions LDAP basées sur les entrées utilisateur. Lorsqu’une application
ne parvient pas à nettoyer correctement les entrées utilisateur, il est possible de modifier les
instructions LDAP à l’aide d’un proxy local. Cela peut entraîner l’exécution de commandes
arbitraires telles que l’octroi d’autorisations pour les requêtes non autorisées et la
modification du contenu dans l’arborescence LDAP. Les mêmes techniques d’exploitation
avancées disponibles dans l’injection SQL peuvent être appliquées de la même manière dans
l’injection LDAP
Dans ce deuxième exemple nous allons refaire la même chose mais cette fois nous allons
utiliser un annuaire LDAP à la place de la base de données MySQL pour l’authentification
des utilisateurs.
IV.1. Configuration de l'environnement
On va utiliser XAMPP (X-operating system, Apache, Mysql, Php, Perl) sur Windows 10 pour
héberger et exécuter l’application et installer notre annuaire dans une machine Ubuntu
20.04.6.
Vérifiions si Apache prend en charge l’extension ldap dans le fichier php.ini
18
Le dossier d’hébergement de site (application) de XAMPP est C:\xampp\htdocs\
Le dossier ldap est le répertoire de base de l’application
input[type=submit] {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
19
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type=submit]:hover {
background-color: #45a049;
}
div {
width: 50%;
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
}
</style>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Formulaire injections LDAP</title>
</head>
<body>
<h1>Formulaire connexion</h1>
<div>
<form action="accueil.php" method="post">
accueil.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// connexion
20
$ldapServer = 'ldap://192.168.1.153';
$ldapPort = 389;
$username = $_POST['username'];
$password = $_POST['password'];
$ldapSearchBase = 'ou=people,dc=rtn,dc=sn';
//Filtre de recherche
$ldapSearchFilter = "(&(uid=$username)(userPassword=$password))";
// Recherche de l'utilisateur
$ldapResult = ldap_search($ldapConn, $ldapSearchBase, $ldapSearchFilter);
if ($entries['count']) {
$userDn = $entries[0]['dn'];
21
$ii=0;
for ($i=0; $ii<$entries[$i]["count"]; $ii++){
$data = $entries[$i][$ii];
echo $data.": ".$entries[$i][$data][0]."<br>";
}
} else {
echo 'Mot de passe incorrect.';
}
} else {
echo 'Utilisateur non trouvé.';
}
22
L’application fonctionne correctement.
(& (... C1...) (... C2...)) ou avec plus de deux critères: (& (... C1...) (... C2...) (... C3...) (...
C4...))
23
Avec l’opération OU :
(| (... C1...) (... C2...)) ou avec plus de deux critères: (| (... C1...) (... C2...) (... C3...) (... C4...))
Les critères de recherche consistent en une exigence pour un attribut LDAP, par exemple
(givenname=Mbaye).
Les règles suivantes devraient être prises en compte :
Dans un annuaire LDAP chaque DN pointe vers exactement une entrée, qui peut être
considérée comme une ligne dans un SGBDR. Pour chaque entrée, il y aura un ou plusieurs
attributs analogues aux colonnes SGBDR. Si on veut rechercher dans LDAP certains attributs,
on peut le faire avec des filtres de recherche.
Dans notre exemple le filtre pour la vérification des utilisateurs est :
(&(uid=$username)(userPassword=$password))";
$ldapSearchFilter = "(&(uid=$username)(userPassword=$password))";
uid=*
userPassword=*
➔ (&(uid =*)( userPassword =*))
uid =*)(&
userPassword =*)(&
24
➔(&(uid=*)(&)( userPassword =*)(&))
user=*)(|(&
userPassword =pwd)
➔(&(uid=*)(|(&)( userPassword=pwd))
uid = mbaye)(!(&(|
userPassword = any))
➔ (&(uid = mbaye)(!(& (|) (userPassword =any))))
uid =*
userPassword =*)(&
➔ (&(uid=*)( userPassword=*)(&))
Test d’authentification
25
Tous ces codes ci-dessus confirme que l’application est vulnérable aux injections ldap.
IV.4. Correctif
Pour éviter les effets néfastes du code malveillant comme illustré ci-dessus, nous devons
nettoyer toutes les entrées utilisateur pour nous assurer que la chaîne de filtre contient des
caractères valides.
Pour cela on utilise la fonction ldap_escape() qui est une fonction de PHP qui permet
d'échapper (ou d'éviter) l'utilisation incorrecte de caractères spéciaux dans des chaînes de
caractères avant de les utiliser dans des filtres LDAP ou des DN (Distinguished Name, Nom
Distingué). Cette fonction est utile pour éviter des erreurs potentielles lors de la construction
de filtres de recherche LDAP ou de noms distingués, en veillant à ce que les valeurs soient
correctement formatées et sécurisées.
//Filtre de recherche
//$ldapSearchFilter = "(&(uid=$username)(userPassword=$password))";
26
On voit qu’il plus possible d’injecter du code.
Les injections LDAP peuvent être complexes et dépendent souvent du contexte d'utilisation
des données dans les requêtes LDAP. Utiliser ldap_escape() vous aide à vous assurer que les
valeurs que vous insérez dans les filtres ou les DNs sont correctement échappées pour éviter
des erreurs potentielles. Cela peut également contribuer à prévenir les attaques d'injection
LDAP basées sur des caractères spéciaux qui pourraient être mal interprétés par le serveur
LDAP.
Cependant, pour une protection complète contre les injections LDAP, il est essentiel de suivre
les meilleures pratiques de sécurité.
Conclusion
Les injections SQL/LDAP sont des menaces très sérieuses pour la sécurité des applications
web. Les attaquants exploitent ces vulnérabilités en insérant des instructions SQL/LDAP
malveillantes dans les données d'entrée de l'application. Cela peut entraîner la divulgation de
données sensibles, la manipulation de la base de données, voire la prise de contrôle complète
du système.
Pour prévenir les injections, les développeurs doivent adopter des bonnes pratiques de
sécurité, notamment l'utilisation de requêtes préparées et la validation rigoureuse des données
entrantes.
27