1. LDAP-Injection
LDAP (Light Directory Access Portocol) ist ein leichtes Verzeichniszugriffsprotokoll, das auf dem X.500-Standard basiert und eine Zugriffsmethode bietet Die Verzeichnisdatenbank Dienste und Protokolle, die häufig zur Bildung von Verzeichnisdiensten mit Verzeichnisdatenbanken verwendet werden. Das Verzeichnis ist eine professionelle verteilte Datenbank, die für Abfragen, Durchsuchen und Suchen optimiert ist. Es organisiert Daten in einer Baumstruktur, ähnlich dem Dateiverzeichnis in Linux/Unix-Systemen. Es eignet sich zum Speichern von Daten, die sich nicht häufig ändern, wie z. B. öffentliche Zertifikate, Sicherheitsschlüssel und Informationen zu physischen Unternehmensgeräten, im Verzeichnis. Ähnlich wie SQL ist LDAP ein Suchprotokoll mit Abfragesyntax und dem Risiko potenzieller Injektionsangriffe. LDAP-Injection bezieht sich auf eine Angriffsmethode, bei der die Eingabezeichenfolge, wenn der Client eine Abfrageanforderung sendet, einige Sonderzeichen enthält, wodurch die ursprüngliche Abfragestruktur von LDAP geändert wird und dadurch der Zugriff auf mehr nicht autorisierte Daten ermöglicht wird.
Dieser Artikel verwendet den JAVA-Sprachquellcode als Beispiel, um die Ursachen und Reparaturmethoden der LDAP-Injection-Schwachstelle in der CWE-ID 90 zu analysieren: Unsachgemäße Neutralisierung spezieller Elemente, die in einer LDAP-Abfrage verwendet werden („LDAP-Injection“) ') Probe . Einzelheiten finden Sie unter:
2. Gefahren von Bei der LDAP-Injection
Bei der LDAP-Injection werden vom Benutzer eingegebene Parameter verwendet, um bösartige LDAP-Abfragen zu generieren und LDAP-Filter zu erstellen, um die Zugriffskontrolle und die Eskalation von Benutzerrechten zu umgehen. Durch die Konstruktion normaler Filter wird die Injektion von UND- und ODER-Operationen implementiert, um vertrauliche Informationen zu erhalten.
Von Januar 2018 bis Januar 2019 gab es in CVE insgesamt 4 diesbezügliche Schwachstelleninformationen. Einige der Sicherheitslücken sind wie folgt:
Übersicht
CVE-2018-12689
phpLDAPadmin 1.2.2 Erlaubt über cmd. PHP? LDAP-Injection mit einem manipulierten serverid-Parameter in der cmd=loginform-Anfrage oder einem manipulierten Benutzernamen und Passwort im Anmeldebereich.
| CVE-2018-5730 | MIT krb5 1.6 oder höher ermöglicht authentifiziertem kadmin das Hinzufügen von Principals zur LDAP-Kerberos-Datenbank. Dies ist möglich Umgehen Sie die DN-Containerprüfung, indem Sie die Datenbankparameter „linkdn“ und „containerdn“ oder die DN-Zeichenfolge als Erweiterung angeben.
CVE-2016-8750 | Apache Karaf verwendete vor 4.0.8 das LDAPLoginModule, um Benutzer über LDAP zu authentifizieren. Allerdings ist der Benutzername nicht korrekt codiert und daher anfällig für einen LDAP-Injection-Angriff, der zu einem Denial-of-Service führt. |
CVE-2011-4069 | PacketFence html/admin/login.php vor 3.0.2 ermöglicht entfernten Angreifern die Durchführung eines LDAP-Injection-Angriffs , wodurch die Authentifizierung über einen manipulierten Benutzernamen umgangen wird. |
3. Beispielcode
Das Beispiel stammt aus der Samate Juliet Test Suite für Java v1.3 (https://samate.nist.gov/SARD/testsuite.php), Quelldateiname: CWE90_LDAP_Injection__connect_tcp_01.java.
3.1 Fehlercode
In den Zeilen 39-61 des obigen Beispielcodes stellt das Programm eine TCP-Verbindung her, liest die Socket-Daten und weist sie der Variablen data
, erstellen Sie dynamisch eine LDAP-Abfrageanweisung in Zeile 118 und führen Sie sie in Zeile 119 aus. LDAP kapselt gängige Objektklassen für Personalorganisationen. Beispielsweise enthält eine Person Attribute wie Nachname (sn), Vorname (cn), Telefonnummer (telephoneNumber) und Passwort (userPassword). Mit dieser Abfrage soll überprüft werden, ob ein Mitarbeiter mit dem Namen Variable data
vorhanden ist. Die Variable Führt eine beliebige Filterung nach Dateninhalten durch
. Wenn bei Verwendung der einfachsten Injektionsmethode der Wert des eingehenden Parameters „*“ ist, lautet die erstellte dynamische Abfragebedingung „(cn=*)“, wodurch die Informationen aller Mitarbeiter abgefragt werden können, was zu Informationslecks führt. data
,在118 行动态构造一个 LDAP 查询语句,119 行对其加以执行。LDAP 为人员组织机构封装了常见的对象类,比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码 (userPassword) 等属性。该查询为了验证是否存在名为变量 data
的员工,但并未对变量 data
的内容做任何过滤。使用最简单的注入方式,令传入参数的值为“*”,则构造的动态查询条件为 "(cn=*)”,这样可以查询到所有员工的信息,导致信息泄露。
对上文中的样例代码进行360代码卫士检测后,发现存在“LDAP注入”漏洞,安全等级评定为高。数据污染源以及数据流向可以通过跟踪路径分析得出并在代码的第120行报告缺陷,图1亦如是
图1:LDAP 注入的检测示例
3.2 修复代码
在上述修复代码中,第119行使用 javax.naming.ldap
包下扩展类 BaseControl
接收需要被处理的参数,第120行 control
对象调用 getEncodedValue()
方法将接收的参数 data
进行编码,编码后的值为字符对应的 ASN.1BER
Nach dem Testen des obigen Beispielcodes mit 360 Code Guard wurde festgestellt, dass eine „LDAP-Injection“-Schwachstelle bestand und die Sicherheitsstufe als hoch eingestuft wurde. Die Quelle der Datenverschmutzung und die Datenflussrichtung können durch eine Trace-Pfad-Analyse ermittelt werden und der Fehler wird in Zeile 120 des Codes gemeldet, wie in Abbildung 1 dargestellt
Abbildung 1: Beispiel für die LDAP-Injection-Erkennung
3.2 Reparaturcode
Im obigen Reparaturcode verwendet Zeile 119 javax.naming.ldap
Die Erweiterungsklasse unter dem Paket BaseControl
empfängt die Parameter, die benötigt werden verarbeitet werden soll, ruft Zeile 120 dasSteuerelement
-Objekt die getEncodedValue()
-Methode auf und Die Parameter Daten
werden codiert, und der codierte Wert ist der ASN.1BER Codierungswert, der dem Zeichen entspricht. Das codierte Byte-Array enthält keine Sonderzeichen, die bei der Befehlsanalyse beteiligt sind, und es kann eine LDAP-Abfrageanweisung mit normaler Struktur und normalem Inhalt erstellt werden, wodurch das Auftreten einer LDAP-Injection vermieden wird. <blockquote>
<ul class=" list-paddingleft-2">Verwenden Sie 360 Code Guard, um den reparierten Code zu erkennen, und Sie können sehen, dass der Fehler „LDAP-Injection“ nicht mehr besteht. Wie in Abbildung 2 dargestellt: <li><p></p></li>
<li><p>Abbildung 2: Erkennungsergebnisse nach der Reparatur </p></li>
</ul>4. So vermeiden Sie die LDAP-Injektion</blockquote>🎜🎜Die Hauptursache der LDAP-Injektion besteht darin, dass Angreifer LDAP-Metazeichen verwenden, um die Bedeutung von LDAP zu ändern Abfragen. Beim Erstellen eines LDAP-Filters müssen Programmierer klären, welche Zeichen als Befehlsanalyse und welche als Datenanalyse behandelt werden sollen. Um zu verhindern, dass Angreifer die verschiedenen voreingestellten Situationen der Programmierer verletzen, sollte mithilfe einer Whitelist-Methode sichergestellt werden, dass die benutzergesteuerten Werte in LDAP-Abfragen vollständig aus einem vorgegebenen Zeichensatz stammen und keine LDAP-Metazeichen enthalten. Wenn benutzergesteuerte numerische Bereichsanforderungen LDAP-Metazeichen enthalten müssen, sollte der entsprechende Kodierungsmechanismus verwendet werden, um die Bedeutung dieser Metazeichen in LDAP-Abfragen zu umgehen. 🎜🎜🎜🎜🎜 So wie &,! , |, =, ,,, +, -, ", ',; Diese Zeichen werden unter normalen Umständen nicht verwendet. Wenn sie in der Benutzereingabe erscheinen, müssen sie mit Backslashes maskiert werden. 🎜 🎜🎜 🎜Es gibt auch Zeichen wie (,),,*,/,NUL, die nicht nur mit Backslashes verarbeitet werden müssen, sondern die Zeichen müssen auch in entsprechende ASCII-Codewerte umgewandelt werden 🎜🎜🎜🎜.
Das obige ist der detaillierte Inhalt vonWie man die LDAP-Injektion versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!