Wenn die Essenz der SQL-Injektion darin besteht, Zeichenfolgen zu spleißen, ist die LDAP-Injektion als eine Art Injektion keine Ausnahme. Interessanter ist, dass es sich um das Spleißen von Klammern handelt (SQL-Injektion). Verkettet auch Klammern, es ist jedoch konventioneller zu sagen, dass es Zeichenfolgen verkettet.
Im Kapitel zur Umgebungskonfiguration wurde die Konfiguration der LDAP-Umgebung in Bee-Box ausführlich besprochen. Das Übungskapitel zum Schießstand befasst sich mehr mit dem Verbindungsprozess zwischen PHP und LDAP und der Einführung der in der Bee-Box verwendeten Sonderfunktionen Mitte und einige Techniken zum Zusammenfügen von Klammern.
Lassen Sie uns zunächst über den Anmeldevorgang des LDAP-Schießstands in bwapp sprechen:
Zuallererst handelt es sich um eine LDAP-Anmeldeschnittstelle. Die URL lautet http://192.168.3.184/bWAPP/ldap_connect.php Schauen Sie sich dieses PHP direkt an.
Ab Code 133 der Datei ldap_connect.php sind die fünf Variablen $message, $login, $password, $server, $dn.
Wozu dienen die erste dieser fünf Variablen? Die zweite ist der Benutzername für die Anmeldung beim LDAP-Server, das dritte Passwort, die vierte Serveradresse und der fünfte Distinguished Name (beschreibt einen vollständigen LDAP-Pfad).
Die erste if-Anweisung besteht darin, das Login-LDAP-Formular zu löschen, und die zweite if-Anweisung besteht darin, festzustellen, ob die fünf Variablen null sind. Der Fokus liegt auf dem anderen if- und else-Anweisungen, machen wir sie nacheinander.
Schauen Sie sich zunächst die drei Funktionen ldap_connect, ldap_set_option, ldap_bind vor dem ersten if an und erklären Sie nacheinander die Funktionen dieser drei Funktionen.
ldap_connect: wird zum Herstellen einer Verbindung zur LDAP-Datenbank verwendet. Das Format lautet wie folgt: Die Verbindung schlägt fehl, wenn das Rückgabeergebnis 0 ist. Die Verbindung ist mit anderen Werten erfolgreich.
ldap_set_option($link_identifier,$option, &$retval): Empfängt drei Parameter
$link_identifier
ldap_connect()-Funktion gibt die LDAP-Verbindungskennung zurück (um festzustellen, ob die LDAP-Verbindung erfolgreich ist)
$option kann die akzeptieren Wert Wie folgt:
LDAP_OPT_DEREF(int): Wie mit Aliasen bei der Suche umgegangen wird. Der Wertebereich ist wie folgt: LDAP_DEREF_NEVER(0, Standardwert), LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)
LDAP_OPT_NETWORK_TIMEOUT (int): Netzwerk-Timeout-Sekunden, LDAP_NO_LIMIT (0, Standardwert) bedeutet nie Timeout.
LDAP_OPT_PROTOCOL_VERSION(int): Geben Sie die verwendete LDAP-Protokollversion an, der Wertebereich ist wie folgt: LDAP_VERSION2 (2, Standardwert), LDAP_VERSION3 (3).
LDAP_OPT_REFERRALS(bool): Ob die LDAP-Bibliothek automatisch den vom LDAP-Server zurückgegebenen Referenzen folgt. Der Wertebereich ist wie folgt: TRUE (1, Standardwert), FALSE (0).
&$retval ist eine Variable, die Optionswerte akzeptiert
Zum Beispiel der Code in bwapp:
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION, 3);
Die Bedeutung dieses Codes ist, dass, wenn die LDAP-Verbindung erfolgreich ist, Geben Sie dann LDAP an. Das verwendete Protokoll ist Version 3. (Hier muss nicht auf Details eingegangen werden, es handelt sich bei allen um anwendbare Formate)
ldap_bind($link_identifier,$bind_rdn,$bind_password)
$link_identifier: die von der Funktion ldap_connect() zurückgegebene LDAP-Verbindungskennung (um festzustellen, ob die LDAP Verbindung ist erfolgreich)
$bind_rdn: Verwenden Sie den angegebenen RDN, also den Anmeldepfad, z. B. cn=admin,dc=bwapp,dc=local
$bind_password: Geben Sie das Anmeldekennwort an.
ldap_search($link_identifier, $dn,$filter): LDAP-Verzeichnissuchfunktion, gibt erfolgreich den Ressourcendeskriptor eines Ergebnissatzes zurück, der normalerweise von anderen Funktionen als $result_identifier referenziert wird, und gibt bei Fehler FALSE zurück.
$link_identifier: die von der Funktion ldap_connect() zurückgegebene LDAP-Verbindungskennung (um festzustellen, ob die Verbindung erfolgreich ist)
$dn: der DN des zu durchsuchenden Verzeichnisses
$filter: Suchfilter. „(objectClass=*)“ bedeutet beispielsweise, alle Einträge zu durchsuchen (bei der Lesefunktion sind es alle Attribute).
Quellcode in bwapp: ldap_search($ds, $dn,$filter), wobei $ds=ldap_connect(),
$dn=“DC=bwapp,DC=local“,$filter=(cn=*) (Das heißt, cn in allen Bereichen) Diese drei Parameter geben an, dass die Funktion ldap_search angibt, dass alle Verzeichnisse des aktuellen Servers abgefragt werden (relativ zu bwapp).
ldap_count_entries($link_identifier,$search): Gibt die Anzahl der Abfrageergebnisse zurück
$link_identifier: Die von der Funktion dap_connect() zurückgegebene LDAP-Verbindungskennung (um festzustellen, ob die Verbindung erfolgreich ist)
$search: = ldap_search( $link_identifier, $ dn, $filter) gibt die Ergebnismenge der Abfrage zurück.
An diesem Punkt ist die Funktion fast analysiert. Lassen Sie uns die allgemeine Idee dieser Verbindungsdatei skizzieren.
Von Zeile 149 bis Zeile 163 bestimmt der Code, ob die verschiedenen erhaltenen Werte leer sind. Wenn sie leer sind, wird eine Eingabeaufforderung ausgegeben.Zeilen 165 bis 198 werden verwendet, um festzustellen, ob die Anmeldung erfolgreich war. Zeilen 165 bis 184 werden verwendet, um festzustellen, ob der LDAP-Dienst vorhanden ist Datenbankname).
Von Zeile 200 bis Zeile 236 wird festgestellt, ob der entsprechende LDAP-Pfad vorhanden ist. Wenn er nicht vorhanden ist, wird die entsprechende Eingabeaufforderungsmeldung ausgegeben .php, also die LDAP-Abfrage. Nachdem die Abfrageergebnisse in ldapi abgerufen wurden, werden die Ergebnisse als Tabelle ausgegeben.
Der Ort, an dem die Tabelle ausgegeben wird, befindet sich in der Datei ldapi.php. Schauen Sie sich als Nächstes den Code in ldapi.php an.
Beginnen Sie direkt ab Zeile 231. Binden Sie wie oben erwähnt das LDAP-Verzeichnis. Wenn Sie es nicht verstehen, können Sie den LDAP-Bindungsteil oben lesen Wenn das LDAP-Verzeichnis erfolgreich gebunden ist, beginnen Sie mit der Abfrage. Der Abfragecode beginnt in Zeile 242. Vom Empfang des Werts des POST-Parameters user bis zum Einrichten eines Alias ($search_field_1, $search_field_2, $search_field_3), den Vorschriften Filter ($filter) (ein Filter ist eine Abfrageanweisung, ähnlich einer SQL-Anweisung), die Syntaxregeln lauten wie folgt:
OperatorGleichheitszeichen | = Erstellen Sie einen Filter, der erfordert, dass ein bestimmtes Feld einen bestimmten Wert hat. | |
---|---|---|
* | stellt ein Feld dar, das jedem Wert außer NULL entsprechen kann. | |
( ) | Separate Filter, damit andere logische Operatoren funktionieren können. | |
& | . Alle Bedingungen der entsprechenden Reihe müssen wahr sein. | |
|. Mindestens eine Bedingung in der entsprechenden Reihe muss wahr sein. | Nicht | |
Schließen Sie alles aus, was den Filterkriterien entspricht. |
Alle Objekte zurückgeben, die Ladeprobleme verursachen können: objectClass=* Alle als „Person“ angegebenen Benutzerobjekte zurückgeben: (&(objectClass=user)(objectCategory=person)) Nur Mailingliste zurücksenden: (objectCategory=group) Nur öffentliche Ordner zurückgeben: (objectCategory=publicfolder) Alle Benutzerobjekte zurückgeben, aber Benutzerobjekte ausschließen, deren primäre E-Mail-Adresse mit „test“ beginnt: ( &(&(objectClass= user)(objectCategory=person))(!(mail=test*))) Gibt alle Benutzerobjekte zurück, außer denen, deren primäre E-Mail-Adresse mit „test“ endet: (& (&(objectClass=user)(objectCategory= person))(!(mail=*test))) Gibt alle Benutzerobjekte zurück, schließt jedoch diejenigen aus, deren primäre E-Mail-Adresse das Wort „test“ enthält: ( &(&(objectClass=user)(objectCategory=person) )(!(mail=*test*))) Gibt alle Benutzerobjekte zurück, die als „Person“ angegeben sind und zu einer Gruppe oder Verteilerliste gehören, sowie ein Alias-Objekt: (|(&(objectClass=user)(objectCategory =person))(objectCategory=group)) Gibt alle als „Person“ angegebenen Benutzerobjekte, alle Gruppenobjekte und alle Kontakte zurück, schließt jedoch alle Objekte aus, deren Wert als „extensionAttribute9“ definiert ist: (&(|( |(&(objectClass=user)(objectCategory=person))(objectCategory=group))(objectClass=contact))(!(extensionAttribute9 =*))) Gibt alle DN zurück (CN=GRoup,OU=Users,DC =Domain,DC) Benutzer, die als Gruppenmitglieder identifiziert wurden: (&(objectClass=user)(objectCategory=person)(memberof= CN=Group,CN=Users,DC=Domain,DC=com)) Alle Benutzer zurückgeben : Microsoft®Active Directory® LDAP-Server: (&(objectCategory=person)(objectClass=user)) OpenLDAP™-Server: (objectClass=inetOrgPerson) IBM® Notes®Domino LDAP-Server: (objectClass=dominoPerson) Durchsuchen Sie IBM Notes Domino LDAP nach allen Objekten, deren E-Mail-Adresse als „Person“ oder „Gruppe“ definiert ist: ( &(|(objectClass=dominoPerson)(objectClass=dominoGroup)(objectClass=dominoServerMailInDatabase))(mail=* )) ActiveDirectory: Gibt alle gültigen (nicht deaktivierten) Benutzer mit E-Mail-Adressen zurück: (&(objectCategory =person)(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803: =2))) Gibt alle Benutzer zurück, deren Gruppen-DN als Mitglied von Gruppe_1 oder Gruppe_2 identifiziert ist. (&(objectClass=user)(objectCategory=person)(|(memberof=CN=Group_1,cn=Users,DC=Domain,DC=com)(memberof=CN=Group_2,cn=Users,DC=Domain, DC=com))) Alle Benutzer zurückgeben, deren extensionAttribute1-Wert „Engineering“ oder „Sales“ ist (&(objectCategory=user)(|(extensionAttribute1=Engineering)(extensionAttribute1=Sales))) Einführung in die Syntax Regeln abgeschlossen, dann analysieren Sie den Code ab 267 $ldap_fields_to_find definiert ein Array, um das Drucken und Ausgeben von Tabellen und das Empfangen der Ergebnisse von LDAP-Abfragen zu erleichtern. Verwenden Sie $ldap_fields_to_find als vierten Parameter der ldap_search-Funktion, um die Verwendung anzuzeigen alias Speichern Sie die empfangenen Ergebnisse in Form von Schlüssel-Wert-Paaren, geben Sie die Ergebnisse dann an das $info-Array zurück und ordnen Sie schließlich jeden Schlüssel jeder Variablen von Zeile 287 bis Zeile 291 zu und geben Sie schließlich eine Schleife aus und drucken Sie die Tabelle aus Punkt, die Abfrage ist abgeschlossen. Eine kurze Einführung in die LDAP-Injection-Splicing-SyntaxDa LDAP-Filter SQL-Abfrageanweisungen ähneln, schauen Sie sich einfach an, wie Filter in bwapp geschrieben werden. Schauen Sie sich direkt die Variable $filter in der Datei ldapi.php an: $filter="(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for))"; Das Wesentliche der SQL-Anweisung Es besteht darin, einfache Anführungszeichen zu verbinden, und das Wesentliche der LDAP-Anweisung ist das Zusammenfügen von Klammern. Jetzt möchte ich alle Benutzer abfragen, einfach * direkt in Benutzer eingeben, dann wird $filter zu $filter="(|($search_field_1=*)($search_field_2=*)($search_field_3=*) )"; Schauen Sie sich die Ergebnisse in bwapp an Es werden viele Benutzer zurückgegeben, aber nicht genug, weil ich meine Administratoren sehen möchte, dann muss ich einen solchen LDAP-Filter erstellen. $filter="(|($search_field_1=*)(objectclass=*)($search_field_2=*)($search_field_3=*))"; Auf diese Weise kann ich alle Benutzer abfragen, einschließlich Administratoren, objectclass =* bedeutet, so lange zu suchen, wie es existiert, also global. Dann geben Sie *)(objectclass=* in das Benutzerfeld ein. Sehen Sie sich die Ergebnisse an. Der Administrator erscheint und die Injektion ist erfolgreich.
|
Das obige ist der detaillierte Inhalt vonSo führen Sie Range-Übungen mit Bee-Box-LDAP-Injektion durch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!