Table des matières

LDAP - Injection

Description

Les injections LDAP sont une forme d'attaque qui exploitent des vulnérabilités dans l'implémentation du protocole LDAP. Elles consistent à insérer du code malveillant dans les requêtes LDAP à destination de l'annuaire. L'objectif peut être de contourner les contrôles de sécurité et d'accéder à des informations sensibles. Ces injections peuvent être effectuées via des formulaires présents sur des applications web ou des interfaces de gestion d'annuaire.

LDAP (Lightweight Directory Access Protocol) est un protocole utilisé pour interroger une base d'annuaire. Ce dernier définit également un langage de requêtes permettant de communiquer avec les données présentes dans l'annuaire. Ces requêtes peuvent par exemple être utilisées dans des systèmes d'authentification utilisateurs (login + mot de passe) ou bien dans des applications afin de récupérer des informations.

De la même manière qu'il est parfois possible d'effectuer des injections SQL sur une application vulnérable pour lire le contenu d'une base de données ou bypasser une authentification, des applications peuvent être vulnérables aux injections LDAP.

Les principales différences entre les requêtes LDAP et SQL sont les suivantes :

Pré-requis d'exploitation

Pour exploiter cette vulnérabilité, il est nécessaire d’avoir accès à une application qui permet de soumettre des requêtes LDAP.

Connaissances nécessaires

Outils nécessaires

Flux d'exécution

Explorer

Naviguer sur l’application pour identifier les points d'entrées potentiellement vulnérables à des injections LDAP.

Expérimenter

Envoyer des requêtes LDAP pour tenter de schématiser la structure de l'annuaire LDAP cible. Cette étape permettra à l'attaquant de pouvoir écrire des requêtes qui contourneront les contrôles de sécurité mis en place.

Exploiter

Conséquences potentielles

Une exploitation réussie de ce type de vulnérabilité peut permettre :

Contre-mesures

Les contre-mesures suivantes peuvent être mises en œuvre :

Comment cela fonctionne

Les scénarios suivants peuvent être joués via l’exploitation de cette vulnérabilité :

Exemple 1

Voici l'exemple d'une application Python qui réalise une requête LDAP à destination d'un annuaire :

import ldap
 
# Connexion au serveur LDAP
ldap_conn = ldap.initialize("ldap://ldap.example.com")
 
# Recherche d'utilisateur
search_filter = "(uid=%s)" % user_input
result = ldap_conn.search_s("dc=example,dc=com", ldap.SCOPE_SUBTREE, search_filter)
 
# Affichage des résultats
for dn, entry in result:
    print(entry)
 
# Fermeture de la connexion
ldap_conn.unbind()

La variable user_input est utilisée pour construire le filtre de recherche LDAP. Si un utilisateur malveillant fournit une entrée malicieuse dans cette variable, il peut alors être en mesure de lister tous les utilisateurs de l'annuaire ou accéder à des informations sensibles.

Exemple 2

Voici un code vulnérable qui effectue une authentification via un annuaire LDAP :

$ldap_server = "ldap.example.com";
$ldap_dn = "ou=users,dc=example,dc=com";
$username = $_POST['username'];
$password = $_POST['password'];
 
$ldap_conn = ldap_connect($ldap_server);
ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3);
 
$bind = ldap_bind($ldap_conn, $username, $password);
$filter = "(&(objectclass=user)(uid=$username))";
$search = ldap_search($ldap_conn, $ldap_dn, $filter);
 
$entries = ldap_get_entries($ldap_conn, $search);

Dans le cas ou un utilisateur s'authentifierait de manière légitime, la requête LDAP générée par le code ci dessus serait :

(&(objectclass=user)(uid=admin)(userPassword=password123))

Si un utilisateur malveillant insère le payload “admin)(&))” dans le champ username, et “toto” dans le champ password, alors la requête LDAP générée sera :

(&(objectclass=user)(uid=admin)(&))(userPassword=toto))

L'insertion permet de bypasser le contrôle sur le mot de passe car le serveur LDAP va interpréter seulement le premier filtre et retourner les informations de l'utilisateur admin, sans évaluer la condition sur le mot de passe.

Exemple 3

Voici un exemple de requête LDAP pour rechercher tous les utilisateurs d'un domaine avec un nom de famille spécifique :

(&(objectCategory=user)(sn=Smith))

Cela renverra tous les utilisateurs dont le nom de famille est “Smith”.

En comparaison, voici un exemple de requête SQL réalisant une recherche similaire :

SELECT * FROM users WHERE last_name = 'Smith';

CWEs

References

URL :

Retour fiches vulnérabilités