LDAP (Light Directory Access Portocol) est un protocole d'accès aux annuaires léger basé sur la norme X.500. Il fournit des services et des protocoles pour accéder aux méthodes de base de données d'annuaire. bases de données d'annuaires. Le répertoire est une base de données distribuée professionnelle optimisée pour les requêtes, la navigation et la recherche. Il organise les données dans une structure arborescente, similaire au répertoire de fichiers des systèmes Linux/Unix. Il convient au stockage de données qui ne changent pas fréquemment, telles que les certificats publics, les clés de sécurité et les informations sur les appareils physiques de l'entreprise, dans l'annuaire. Semblable à SQL, LDAP est un protocole de recherche avec une syntaxe de requête et un risque d'attaques potentielles par injection. L'injection LDAP fait référence à une méthode d'attaque dans laquelle la chaîne d'entrée lorsque le client envoie une requête de requête contient des caractères spéciaux, provoquant la modification de la structure de requête originale de LDAP, permettant ainsi l'accès à davantage de données non autorisées.
Cet article prend le code source du langage JAVA comme exemple pour analyser les causes et les méthodes de réparation de la vulnérabilité d'injection LDAP dans l'exemple CWE ID 90 : Improper Neutralization of Special Elementsused in an LDAP Query (« LDAP Injection »). Pour plus de détails, veuillez consulter :
CWE ID 90 : Neutralisation incorrecte des éléments spéciaux utilisés dans une requête LDAP (« Injection LDAP »)
http://cwe.mitre.org/data/definitions/90.html
CWE ID 639 : contournement d'autorisation via une clé contrôlée par l'utilisateur
http://cwe.mitre.org/data/definitions/639.html
2. Dangers de l'injection LDAP
LDAP L'injection consiste à utiliser les paramètres introduits par les utilisateurs pour générer des requêtes LDAP malveillantes et à construire des filtres LDAP pour contourner le contrôle d'accès et l'élévation des privilèges des utilisateurs. Grâce à la construction de filtres normaux, l'injection des opérations ET et OU est mise en œuvre pour obtenir des informations sensibles.
De janvier 2018 à janvier 2019, il y avait un total de 4 informations de vulnérabilité associées dans CVE. Certaines des vulnérabilités sont les suivantes :
Numéro CVE | Aperçu |
---|---|
CVE-2018-12689 | phpLDAPadmin 1.2.2 autorisé via cmd.php ? Injection LDAP avec un paramètre serverid contrefait dans la requête cmd=loginform ou un nom d'utilisateur et un mot de passe contrefaits dans le panneau de connexion. |
CVE-2018-5730 | MIT krb5 1.6 ou version ultérieure permet aux administrateurs authentifiés d'ajouter des entités à la base de données LDAP Kerberos pour contourner les vérifications du conteneur DN en fournissant les paramètres de base de données "linkdn" et "containerdn", ou de contourner le conteneur DN vérifiez en fournissant la chaîne DN comme extension. |
CVE-2016-8750 | Apache Karaf avant 4.0.8 utilise le LDAPLoginModule pour authentifier les utilisateurs via LDAP. Cependant, le nom d'utilisateur n'est pas correctement codé et est donc vulnérable à une attaque par injection LDAP, entraînant un déni de service. |
CVE-2011-4069 | PacketFence html/admin/login.php avant 3.0.2 permet aux attaquants distants de mener une attaque par injection LDAP pour contourner l'authentification via un nom d'utilisateur contrefait. |
L'exemple provient de Samate Juliet Test Suite pour Java v1.3 (https://samate.nist.gov/SARD/testsuite.php), nom du fichier source : CWE90_LDAP_Injection__connect_tcp_01.java.
Dans les lignes 39 à 61 de l'exemple de code ci-dessus, le programme établit une connexion TCP, lit les données Socket et les affecte à la variable data
, construisez dynamiquement une instruction de requête LDAP à la ligne 118 et exécutez-la à la ligne 119. LDAP encapsule les classes d'objets courantes pour les organisations du personnel. Par exemple, une personne contient des attributs tels que le nom (sn), le prénom (cn), le numéro de téléphone (telephoneNumber) et le mot de passe (userPassword). Cette requête vise à vérifier s'il existe un employé nommé variable data
, mais elle ne vérifie pas la variable Effectuer un filtrage sur le contenu des données
. En utilisant la méthode d'injection la plus simple, si la valeur du paramètre entrant est "*", alors la condition de requête dynamique construite est "(cn=*)", qui peut interroger les informations de tous les employés, entraînant une fuite d'informations. data
,在118 行动态构造一个 LDAP 查询语句,119 行对其加以执行。LDAP 为人员组织机构封装了常见的对象类,比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码 (userPassword) 等属性。该查询为了验证是否存在名为变量 data
的员工,但并未对变量 data
的内容做任何过滤。使用最简单的注入方式,令传入参数的值为“*”,则构造的动态查询条件为 "(cn=*)”,这样可以查询到所有员工的信息,导致信息泄露。
对上文中的样例代码进行360代码卫士检测后,发现存在“LDAP注入”漏洞,安全等级评定为高。数据污染源以及数据流向可以通过跟踪路径分析得出并在代码的第120行报告缺陷,图1亦如是
图1:LDAP 注入的检测示例
在上述修复代码中,第119行使用 javax.naming.ldap
包下扩展类 BaseControl
接收需要被处理的参数,第120行 control
对象调用 getEncodedValue()
方法将接收的参数 data
进行编码,编码后的值为字符对应的 ASN.1BER
Figure 1 : Exemple de détection d'injection LDAP
javax.naming.ldap
La classe d'extension sous le package BaseControl
reçoit les paramètres qui doivent être traité, la ligne 120 de l'objet control
appelle la méthode getEncodedValue()
et recevra les paramètres les données
sont codées, et la valeur codée est le ASN.1BER valeur d'encodage correspondant au caractère. Le tableau d'octets codé ne contient pas de caractères spéciaux impliqués dans l'analyse des commandes, et une instruction de requête LDAP avec une structure et un contenu normaux peut être construite, évitant ainsi l'apparition d'une injection LDAP. <blockquote>
<ul class=" list-paddingleft-2">Utilisez 360 Code Guard pour détecter le code réparé, et vous pourrez constater que le défaut "injection LDAP" n'existe plus. Comme le montre la figure 2 : <li><p></p></li>
<li><p>Figure 2 : Résultats de la détection après réparation </p></li>
</ul>4. Comment éviter l'injection LDAP</blockquote>🎜🎜La cause première de l'injection LDAP est que les attaquants utilisent des métacaractères LDAP pour modifier la signification de LDAP. requêtes. Lors de la construction d'un filtre LDAP, les programmeurs doivent clarifier quels caractères doivent être traités comme une analyse de commande et quels caractères doivent être traités comme une analyse de données. Afin d'empêcher les attaquants d'envahir diverses situations prédéfinies des programmeurs, une méthode de liste blanche doit être utilisée pour garantir que les valeurs contrôlées par l'utilisateur dans les requêtes LDAP proviennent entièrement d'un jeu de caractères prédéterminé et ne doivent contenir aucun métacaractère LDAP. Si les exigences de plage numérique contrôlées par l'utilisateur doivent contenir des métacaractères LDAP, le mécanisme de codage correspondant doit être utilisé pour échapper à la signification de ces métacaractères dans les requêtes LDAP. 🎜🎜🎜🎜🎜 Comme &,! , |, =, ,,, +, -, ", ',; ces caractères ne sont pas utilisés dans des circonstances normales. S'ils apparaissent dans la saisie de l'utilisateur, ils doivent être échappés avec des barres obliques inverses. 🎜 🎜🎜 🎜Il existe également des caractères tels que (,),,*,/,NUL qui doivent non seulement être traités avec des barres obliques inverses, mais également les caractères doivent être convertis en valeurs de code ASCII correspondantes 🎜🎜🎜🎜.
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!