Si l'essence de l'injection SQL est d'épisser des chaînes, alors l'essence de tout ce qui peut être injecté est d'épisser des chaînes. L'injection LDAP ne fait pas exception en tant que type d'injection. Ce qui est plus intéressant, c'est qu'il s'agit d'épisser des parenthèses (injection SQL). Concatène également les parenthèses, mais il est plus conventionnel de dire qu'il concatène les chaînes).
Dans le chapitre sur la configuration de l'environnement, la configuration de l'environnement ldap dans bee-box a été discutée en détail. Le chapitre pratique du stand de tir porte davantage sur le processus de connexion entre php et ldap, l'introduction des fonctions spéciales utilisées dans le milieu, et quelques techniques pour épisser les parenthèses.
Parlons d'abord du processus de connexion du stand de tir LDAP dans bwapp :
Tout d'abord, il s'agit d'une interface de connexion LDAP. L'URL est http://192.168.3.184/bWAPP/ldap_connect.php. . Jetez un œil à ce php directement ce qui est écrit dans le fichier.
À partir du code 133 du fichier ldap_connect.php, les cinq variables sont $message, $login, $password, $server, $dn.
A quoi sert la première de ces cinq variables ? La seconde est le nom d'utilisateur pour se connecter au serveur LDAP, le troisième mot de passe, la quatrième adresse du serveur et le cinquième nom distinctif (décrit un chemin LDAP complet).
La première instruction if consiste à effacer le formulaire de connexion LDAP, et la seconde instruction if consiste à déterminer si les cinq variables sont nulles. Ce sont toutes des questions triviales. L'accent est mis sur else. déclarations if et else, faisons-les une par une.
Regardez d'abord les trois fonctions ldap_connect, ldap_set_option, ldap_bind avant le premier if, et expliquez tour à tour les fonctions de ces trois fonctions.
ldap_connect : utilisé pour se connecter à la base de données ldap, le format est le suivant
$server = « localhost »
$LDAPCONN=LDAP_Connect($server)
Si la valeur de retour de $LDAPCONN est de type numérique et que le le résultat renvoyé est 0, la connexion échoue. La connexion réussit avec d'autres valeurs.
ldap_set_option($link_identifier, $option, &$retval) : reçoit trois paramètres
$link_identifier
la fonction ldap_connect() renvoie l'identifiant de connexion LDAP (pour déterminer si la connexion LDAP est réussie)
$option peut accepter le valeur Comme suit :
LDAP_OPT_DEREF(int) : Comment gérer les alias lors de la recherche, la plage de valeurs est la suivante : LDAP_DEREF_NEVER(0, valeur par défaut), LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)
LDAP_OPT_NETWORK_TIMEOUT (int) : secondes d'expiration du réseau, LDAP_NO_LIMIT (0, valeur par défaut) signifie ne jamais expirer.
LDAP_OPT_PROTOCOL_VERSION(int) : Spécifiez la version du protocole LDAP utilisée, la plage de valeurs est la suivante : LDAP_VERSION2 (2, valeur par défaut), LDAP_VERSION3 (3).
LDAP_OPT_REFERRALS(bool) : Indique si la bibliothèque LDAP suit automatiquement les références renvoyées par le serveur LDAP. La plage de valeurs est la suivante : TRUE (1, valeur par défaut), FALSE (0).
&$retval est une variable qui accepte les valeurs d'option
Par exemple, le code dans bwapp :
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION, 3);
La signification de ce code est que si la connexion LDAP réussit, puis précisez LDAP. Le protocole utilisé est la version 3. (Pas besoin d'entrer dans les détails ici, ce sont tous des formats appliqués)
ldap_bind($link_identifier,$bind_rdn,$bind_password)
$link_identifier : l'identifiant de connexion LDAP renvoyé par la fonction ldap_connect() (pour déterminer si le LDAP la connexion est réussie)
$bind_rdn : Utilisez le rdn spécifié, c'est-à-dire le chemin de connexion, tel que cn=admin,dc=bwapp,dc=local
$bind_password : Spécifiez le mot de passe de connexion.
ldap_search($link_identifier, $dn,$filter) : fonction de recherche dans l'annuaire LDAP, renvoie avec succès le descripteur de ressource d'un ensemble de résultats, qui est généralement référencé par d'autres fonctions comme $result_identifier, et renvoie FALSE en cas d'échec.
$link_identifier : l'identifiant de connexion LDAP renvoyé par la fonction ldap_connect() (pour déterminer si la connexion est réussie)
$dn : le DN de l'annuaire dans lequel rechercher
$filter : filtre de recherche. Par exemple, "(objectClass=*)" signifie rechercher toutes les entrées (pour la fonction de lecture, cela signifie tous les attributs).
Code source dans bwapp : ldap_search($ds, $dn,$filter), où $ds=ldap_connect(),
$dn=”DC=bwapp,DC=local”,$filter=(cn=*) (C'est-à-dire cn dans toutes les plages), ces trois paramètres indiquent que la fonction ldap_search indique que tous les répertoires du serveur actuel sont interrogés (par rapport à bwapp).
ldap_count_entries($link_identifier,$search) : Renvoie le nombre de résultats de requête
$link_identifier : L'identifiant de connexion LDAP renvoyé par la fonction dap_connect() (pour déterminer si la connexion est réussie)
$search: = ldap_search( $link_identifier, $ dn, $filter) renvoie le jeu de résultats de la requête.
À ce stade, la fonction a presque été analysée. Décrivons l'idée générale de ce fichier de connexion.
De la ligne 149 à la ligne 163, le code détermine si les différentes valeurs obtenues sont vides. Si elles sont vides, un message d'invite est lancé.
Les lignes 165 à 198 sont utilisées pour déterminer si la connexion a réussi. Les lignes 165 à 184 sont utilisées pour déterminer si le service ldap existe. Les lignes 187 à 198 sont utilisées pour déterminer s'il existe un nom distinctif (équivalent au. nom de la base de données).
De la ligne 200 à la ligne 236 consiste à déterminer si le dn correspondant existe, c'est-à-dire si le chemin ldap correspondant existe. S'il n'existe pas, le message d'invite correspondant sera lancé. S'il existe, appelez ldapi. .php, c'est-à-dire la requête ldap. Après avoir obtenu les résultats de la requête dans ldapi, les résultats sont affichés sous forme de tableau.
L'endroit où le tableau est généré se trouve dans le fichier ldapi.php. Ensuite, regardez le code dans ldapi.php.
Commencez directement à partir de la ligne 231. De la ligne 231 à la ligne 240, comme mentionné ci-dessus, liez le répertoire LDAP. Si vous ne comprenez pas, vous pouvez lire la partie de liaison LDAP ci-dessus
. Si l'annuaire LDAP est lié avec succès, lancez la requête. Le code de requête commence à partir de la ligne 242
De la réception de la valeur du paramètre POST user à l'établissement d'un alias ($search_field_1, $search_field_2, $search_field_3), la réglementation Filtre ($filter) (un filtre est une instruction de requête, similaire à une instruction SQL), les règles de syntaxe sont les suivantes :
Operator | Character | Purpose |
---|---|---|
Signe égal | = | Créez un filtre qui nécessite qu'un certain champ ait une valeur donnée. |
Any | * | représente un champ qui peut être égal à n'importe quelle valeur sauf NULL. |
Parenthèses | ( ) | Filtres séparés pour permettre à d'autres opérateurs logiques de fonctionner. |
Combinez les filtres avec | & | . Toutes les conditions de la série correspondante doivent être vraies. |
ou | | | Combinez les filtres. Au moins une condition de la série correspondante doit être vraie. |
Non | ! | Excluez tout ce qui correspond aux critères de filtre. |
Renvoyer tous les objets pouvant causer des problèmes de chargement :
objectClass=*
Renvoyer tous les objets utilisateur spécifiés comme "personne" :
# 🎜🎜# (&(objectClass=user)(objectCategory=person)) Retourner la liste de diffusion uniquement : (objectCategory=group) Retourner uniquement public dossiers : (objectCategory=publicfolder)Renvoyer tous les objets utilisateur, mais exclure les objets utilisateur dont l'adresse e-mail principale commence par "test" : #🎜 🎜#(&(&(objectClass=user)(objectCategory=person))(!(mail=test*)))
Renvoie tous les objets utilisateur mais exclut l'adresse e-mail principale. Objets utilisateur se terminant par "test" :
(&(&(objectClass=user)(objectCategory=person))(!(mail=*test)))
Renvoie tous les objets utilisateur, mais exclut l'utilisateur objets qui contiennent le mot « test » dans leur adresse e-mail principale :
(&(&(objectClass=user)(objectCategory=person))(!(mail= *test*)))#🎜 🎜#
Renvoie tous les objets utilisateur et objets alias spécifiés comme "personne" et appartenant à un groupe ou une liste de distribution : (| (&(objectClass=user)(objectCategory=person)) (objectCategory=group))Renvoie tous les objets utilisateur spécifiés comme "personne", tous les objets de groupe et tous les contacts, mais exclut les objets avec toute valeur définie comme "extensionAttribute9":#🎜 🎜#(&(|(|((&(objectClass=user)(objectCategory=person))(objectCategory=group))(objectClass=contact) )(!(extensionAttribute9=*)))
#🎜🎜 #Renvoie tous les utilisateurs DN (CN=GRoup,OU=Users,DC=Domain,DC) identifiés comme membres du groupe :#🎜 🎜#(&(objectClass=user)(objectCategory=person)(memberof=CN= Group,CN=Users,DC=Domain,DC=com))
Renvoyer tous les utilisateurs :
Microsoft®Active Directory® Serveur LDAP : (&(objectCategory=person) (objectClass=user))
Serveur OpenLDAP™ : (objectClass=inetOrgPerson)
Serveur LDAP IBM® Notes®Domino : (objectClass=dominoPerson)
#🎜 🎜# Recherchez dans IBM Notes Domino LDAP tous les objets dont l'adresse e-mail est définie comme « personne » ou « groupe » :#🎜 🎜#(&(|(objectClass=dominoPerson)(objectClass=dominoGroup)(objectClass=dominoServerMailInDatabase ))(mail=*))
ActiveDirectory : renvoie tous les utilisateurs valides (non désactivés) avec des adresses e-mail ) Utilisateur :
(&(objectCategory=person)(objectClass= user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Renvoie tous les utilisateurs identifiés par le DN du groupe en tant que membres du Groupe_1 ou du Groupe_2.
(&(objectClass=user)(objectCategory=person)(|(memberof=CN=Group_1,cn=Users,DC=Domain,DC=com)(memberof=CN=Group_2,cn= Users,DC=Domain,DC=com)))
Renvoie tous les utilisateurs dont la valeur extensionAttribute1 est "Ingénierie" ou "Ventes"
(&(objectCategory=user)( |(extensionAttribute1=Engineering)(extensionAttribute1=Sales)))
Les règles de syntaxe sont introduites, puis le code à partir de 267 est analysé
#🎜 🎜## 🎜🎜#$ldap_fields_to_find définit un tableau pour faciliter l'impression et la sortie des tableaux et la réception des résultats des requêtes ldap. Utilisez $ldap_fields_to_find comme quatrième paramètre de la fonction ldap_search, indiquant que cet alias est utilisé pour enregistrer le. résultats reçus, c'est-à-dire le formulaire de paire clé-valeur, puis renvoyez le résultat au tableau $info, et enfin mappez chaque clé à chaque variable de la ligne 287 à la ligne 291, et enfin bouclez la sortie et imprimez le tableau à ce stade, la requête est terminée.
Une brève introduction à la syntaxe d'épissage par injection LDAP
Étant donné que les filtres LDAP sont similaires aux instructions de requête SQL, regardez simplement comment écrire des filtres dans bwapp. Regardez directement la variable $filter dans le fichier ldapi.php :
$filter="(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for)) ";
L'essence de l'instruction sql réside dans l'épissage des guillemets simples, et l'essence de l'instruction ldap réside dans l'épissage des parenthèses.
Maintenant, je veux interroger tous les utilisateurs, entrez simplement * directement dans l'utilisateur, puis $filter deviendra $filter="(|($search_field_1=*)($search_field_2=*) ($search_field_3= *))";
Regardez le résultat, l'administrateur apparaît, l'injection est réussie
#. 🎜 🎜#
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!