Unvollständige Filterung von Sonderzeichen

Beschreibung

Unvollständige Filterung von Sonderzeichen ist eine Schwachstelle bei der Eingabevalidierung, bei der Software Daten von einer vorgelagerten Komponente empfängt, aber Sonderzeichen nicht vollständig filtert, bevor sie an eine nachgelagerte Komponente gesendet werden. Obwohl eine gewisse Filterung implementiert sein kann, werden nicht alle Sonderzeichen, nicht alle Instanzen von Sonderzeichen oder nicht alle Variationen der Sonderzeichenkodierung behandelt. Diese partielle Filterung vermittelt ein falsches Sicherheitsgefühl, während bösartige Eingaben weiterhin die nachgelagerte Komponente erreichen können, wo sie als Befehle, Markup oder Steuersequenzen interpretiert werden könnten.

Risiko

Unvollständige Filterung ist besonders gefährlich, weil sie darauf hindeutet, dass Entwickler sich des Sicherheitsproblems bewusst waren, aber eine ungenügend Lösung implementiert haben. Angreifer können unvollständige Filter durch verschiedene Techniken umgehen: Verwendung mehrerer Instanzen gefilterter Sequenzen, unterschiedliche Kodierung von Sonderzeichen, Ausnutzung von Groß-/Kleinschreibung oder Kombination gefilterter Elemente auf Weise, die eine partielle Entfernung überleben. Die Schwachstelle ermöglicht Injection-Angriffe einschließlich Path-Traversal, Command-Injection, SQL-Injection und Cross-Site-Scripting. Da eine gewisse Filterung existiert, kann die Schwachstelle bei grundlegenden Sicherheitstests unentdeckt bleiben.

Lösung

Implementieren Sie eine umfassende Filterung, die alle Instanzen und Variationen gefährlicher Elemente behandelt. Verwenden Sie globale Matching-Flags (wie /g in regulären Ausdrücken), um alle Vorkommen zu ersetzen. Wiederholen Sie Filteroperationen in einer Schleife, bis keine Übereinstimmungen mehr gefunden werden, um verschachtelte Muster zu behandeln. Erwägen Sie die Verwendung von Allowlist-Validierung anstelle von Denylist-Filterung - akzeptieren Sie nur bekannt sichere Zeichen, anstatt bekannt schlechte zu blockieren. Verwenden Sie gut getestete Eingabevalidierungsbibliotheken anstelle von benutzerdefinierten Implementierungen. Bevorzugen Sie Ausgabekodierung, die für den Zielkontext geeignet ist, gegenüber Eingabefilterung. Testen Sie Filterimplementierungen mit verschiedenen Bypass-Techniken einschließlich doppelter Kodierung, Groß-/Kleinschreibungsvariationen und rekursiver Muster.

Häufige Auswirkungen

AuswirkungDetails
IntegritätBereich: Integrität

Unerwarteter Zustand - Ungefilterte Sonderzeichen veranlassen die Anwendung, unbeabsichtigte Zustände zu erreichen oder unbeabsichtigte Operationen auszuführen.
VertraulichkeitBereich: Vertraulichkeit

Anwendungsdaten lesen - Path-Traversal durch unvollständige Filterung legt sensible Dateien offen.
IntegritätBereich: Integrität

Unautorisierten Code ausführen - Injection-Angriffe werden möglich, wenn die Filterung nicht alle gefährlichen Elemente neutralisiert.

Beispielcode

Verwundbarer Code

# Verwundbar: Einzelne Ersetzung statt globaler
my $Username = GetUntrustedInput();

# Verwundbar: Fehlender /g-Modifikator - entfernt nur das ERSTE "../"
$Username =~ s/\.\.\///;

my $filename = "/home/user/" . $Username;
ReadAndSendFile($filename);

# Angriff: Eingabe "../../../etc/passwd"
# Nach einfacher Ersetzung: "../../etc/passwd"
# Vollständiger Pfad: "/home/user/../../etc/passwd" -> "/etc/passwd"
// Verwundbar: Filtert nur spezifisches Tag, nicht alle Variationen
<?php
function vulnerable_filter_xss($input) {
    // Verwundbar: Entfernt nur <script>-Tags in Kleinbuchstaben
    $filtered = str_replace("<script>", "", $input);
    $filtered = str_replace("</script>", "", $filtered);
    return $filtered;
}

// Umgehungen:
// <SCRIPT>alert(1)</SCRIPT> - Groß-/Kleinschreibungsvariante
// <scr<script>ipt>alert(1)</scr</script>ipt> - verschachtelt
// <img onerror=alert(1) src=x> - anderes Tag

Lösungscode

# Behoben: Globale Ersetzung mit rekursiver Filterung
my $Username = GetUntrustedInput();

# Behoben: Verwende /g für globale Ersetzung
# Und Schleife bis stabil, um verschachtelte Sequenzen zu behandeln
my $prev;
do {
    $prev = $Username;
    $Username =~ s/\.\.[\\/]//g;  # Behandelt sowohl / als auch \
    $Username =~ s/%2e%2e[%2f%5c]//gi;  # Behandelt URL-kodiert
} while ($Username ne $prev);

# Besser: Allowlist-Validierung
if ($Username !~ /^[a-zA-Z0-9_.-]+$/) {
    die "Ungültiger Benutzername";
}

my $filename = "/home/user/" . $Username;
// Behoben: Umfassende HTML-Filterung
<?php
function fixed_filter_xss($input) {
    // Behoben: Verwende ordnungsgemäße HTML-Kodierung
    return htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

// Oder verwende Allowlist für spezifische erlaubte Tags
function fixed_filter_allowed_tags($input) {
    // Entfernt alle Tags ausser erlaubten
    return strip_tags($input, '<b><i><u><p><br>');
}

// Am besten: Verwende eine ordnungsgemäße HTML-Sanitizer-Bibliothek
use HTMLPurifier;
function fixed_sanitize_html($input) {
    $config = HTMLPurifier_Config::createDefault();
    $purifier = new HTMLPurifier($config);
    return $purifier->purify($input);
}

Verwandte CWEs

  • CWE-790: Unsachgemäße Filterung von Sonderzeichen (Eltern)
  • CWE-792: Unvollständige Filterung einer oder mehrerer Instanzen von Sonderzeichen (Kind)
  • CWE-795: Nur Filterung von Sonderzeichen an einer bestimmten Position (Kind)

Referenzen

  1. MITRE Corporation. "CWE-791: Incomplete Filtering of Special Elements." https://cwe.mitre.org/data/definitions/791.html
  2. OWASP. "Input Validation Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
  3. OWASP. "Testing for Filter Bypass." OWASP Testing Guide.