Table of Contents
Description
Une Injection LDAP est une attaque utilisée pour exploiter des applications basées sur le web et qui construisent des déclarations LDAP basées sur l'entrée d'utilisateur. Quand une application manque d' aseptiser correctement l'entrée d'un utilisateur, il est possible de modifier les déclarations LDAP en utilisant un proxy local. Il peut s'ensuivre l'exécution de commandes arbitraires comme l'octroi de permissions aux demandes faîtes sans autorisation et se contenter de la modification à l'intérieur de l'arbre LDAP. Les mêmes techniques d'exploitation avancées disponibles dans l' SQL Injection https://www.owasp.org/index.php/SQL_Injection peuvent être de la même façon appliquées dans l'Injection LDAP.
Exemples
Exemple 1
Dans une page avec un formulaire de recherche d'utilisateur, le code suivant est responsable pour récupérer la valeur en entrée et produire une demande LDAP qui sera utilisée dans la base de données LDAP.
<input type=“text” size=20 name=“userName”
>Insert the username</input>
L
a demande LDAP est réduite pour la performance et le code sous-tendant pour cette fonction pourrait être la chose suivante :
String ldapSearchQuery = "(cn=" + $userName + ")"; System.out.println(ldapSearchQuery);
Si la variable $userName n'est pas validée, cela pourrait être possible d'accomplire l'injection LDAP, comme suit :
- Si un utilisateur met “ * ” dans la boîte de recherche, le système peut renvoyer tous les noms d'utilisateur de la base LDAP.
- Si un utilisateur met “jonys) (| (password * ) )”, il produira le code révélant le mot de passe de jonys ( cn jonys ) ( | (password * ) ).
Exemple 2
Le code vulnérable suivant est utilisé dans une application web ASP qui fournit un login s'appuyant sur une base de données LDAP. Sur la ligne 11, la variable userName est initialisée et validée pour vérifier si ce n'est pas en blanc. Alors, le contenu de cette variable est utilisé pour construire une demande LDAP utilisée par SearchFilter sur la ligne 28. L'attaquant a la chance de spécifier ce qui sera mis en doute par le serveur LDAP, et de voir le résultat sur la ligne 33 à 41; tous les résultats et leurs attributs sont affichés.
Code asp vulnérable remarqué :
1. <html>
2. <body>
3. <%@ Language=VBScript %>
4. <%
5. Dim userName
6. Dim filter
7. Dim ldapObj
8.
9. Const LDAP_SERVER = "ldap.example"
10.
11. userName = Request.QueryString("user")
12.
13. if( userName = "" ) then
14. Response.Write("Invalid request. Please specify a valid
15. user name")
16. Response.End()
17. end if
18.
19. filter = "(uid=" + CStr(userName) + ")" ' searching for the user entry
20.
21. 'Creating the LDAP object and setting the base dn
22. Set ldapObj = Server.CreateObject("IPWorksASP.LDAP")
23. ldapObj.ServerName = LDAP_SERVER
24. ldapObj.DN = "ou=people,dc=spilab,dc=com"
25.
26. 'Setting the search filter
27. ldapObj.SearchFilter = filter
28.
29. ldapObj.Search
30.
31. 'Showing the user information
32. While ldapObj.NextResult = 1
33. Response.Write("<p>")
34.
35. Response.Write("<b><u>User information for: " +
36. ldapObj.AttrValue(0) + "</u></b><br>")
37. For i = 0 To ldapObj.AttrCount -1
38. Response.Write("<b>" + ldapObj.AttrType(i) +"</b>: " +
39. ldapObj.AttrValue(i) + "<br>" )
40. Next
41. Response.Write("</p>")
42. Wend
43. %>
44. </body>
45. </html>
Dans l'exemple ci-dessus, nous envoyons le caractère * dans le paramètre d'utilisateur qui se transmettra dans la variable de filtre dans le code qui sera initialisé avec (uid ). Le résultat de l'état LDAP sera que le serveur retournera n'importe quel objet qui contiendra un attribut d'uid comme le nom d'utilisateur. <nowiki>http://www.some-site.org/index.asp?user=</nowiki>
References
- http://www.blackhat.com/presentations/bh-europe-08/Alonso-Parada/Whitepaper/bh-eu-08-alonso-parada-WP.pdf
- http://www.ietf.org/rfc/rfc1960.txt A String Representation of LDAP Search Filters (RFC1960)
- http://www.redbooks.ibm.com/redbooks/SG244986.html IBM RedBooks - Understanding LDAP
