TRAN CONG DANH - SVTT - Mentor: LUU VAN LAN - CVE-2018-7600 - Startdatum: 26/06/2024.
Inhaltsverzeichnis:
- CVE-Zusammenfassung
- Voraussetzungen
- CVE-Analyse
- Gegenmaßnahmen
CVE-Zusammenfassung
- Ein Angreifer könnte eine Drupal-Form-API-Ajax-Anfrage aufrufen, die die Funktion call_user_func auto do enthält
- Drupal vor 7.58, 8.x vor 8.3.9, 8.4.x vor 8.4.6 und 8.5.x vor 8.5.1
Voraussetzungen
CVE-Analyse
- Wir finden, dass die Schlüssel, die call_user_func verwenden, #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate sind

- Die Aufgabe besteht nun darin, herauszufinden, welcher vom Benutzer übermittelte Parameter ein Rendering enthält, den Schlüssel ändern kann und den #post_render-Schlüssel empfängt, um ihn aufzurufen.

- Beim Ändern der Bildgröße ruft der Server die Drupal-API auf

- Die hier enthaltene Funktion &$array ist das Array der Standardelemente, das beim Senden übergeben wird; versuchen wir, ohne Code zu debuggen:

- Angenommen, Sie ändern den Wert von mail beim Hochladen:


- Beim Aufruf der Methode getValue($array, $parents) läuft der Prozess wie folgt ab:
$ref verhindert Referenzen auf $array.
Erste Schleife: $ref verweist auf $array['a'].
Zweite Schleife: $ref verweist auf $array['a']['b'].
Dritte Schleife: $ref verweist auf $array['a']['b']['c'].
Das Endergebnis: $ref verweist auf den Wert 42.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- Nachdem der $form-Wert von der Funktion getValue empfangen wurde, wird $form zu einem Argument für die Render-Funktion

- Die Definition von call_user_func

- Das Ergebnis, wenn ich die Exploit-Datei verwende:

Gegenmaßnahmen
- Patch
** Die Drupal-Entwickler haben einen Patch veröffentlicht, der eine RequestSanitizer-Klasse mit einer stripDangerousValues-Methode hinzufügt, um alle Eingabeelemente des Arrays zu entfernen, deren Schlüssel mit “#” beginnen. Diese Methode bereinigt die Eingaben in $_GET, $_POST und $_COOKIES.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** Die Funktion stripDangerousValues überprüft alle Eingabeparameter einzeln. Die ersten Elemente des Eingabearrays, die einen mit “#” beginnenden Wert haben und nicht auf der Whitelist stehen, werden entfernt.