Nur Filterung einer Instanz eines Sonderzeichens

Beschreibung

Nur Filterung einer Instanz eines Sonderzeichens ist eine Schwachstelle bei der Eingabevalidierung, bei der Software nur ein einzelnes Vorkommen eines gefährlichen Sonderzeichens filtert und zusätzliche Instanzen ungefiltert lässt. Dies tritt typischerweise auf, wenn Entwickler nicht-globale String-Ersetzungsfunktionen oder reguläre Ausdrücke ohne globale Matching-Flags verwenden. Die erste (oder in manchen Fällen letzte) Instanz der gefährlichen Sequenz wird entfernt, aber nachfolgende Instanzen passieren den Filter unverändert, was es Angreifern ermöglicht, Sicherheitskontrollen mit mehreren Kopien der bösartigen Sequenz zu umgehen.

Risiko

Diese Schwachstelle ermöglicht eine unkomplizierte Umgehung von Sicherheitskontrollen. Angreifer fügen einfach eine zusätzliche Kopie der gefilterten Sequenz ein, wissend dass der Filter eine entfernt, aber eine andere übrig lässt. Bei Path-Traversal wird "../../file" nach dem Filtern des ersten "../" zu "../file" - immer noch Traversal erlaubend. Bei XSS wird "<

Lösung

Verwenden Sie beim Filtern gefährlicher Elemente immer globale Ersetzung. In JavaScript verwenden Sie replace(/pattern/g, '') mit dem g-Flag. In Perl verwenden Sie s/pattern//g. In Python verwenden Sie re.sub(), das standardmäßig global ist. Wiederholen Sie Ersetzungsoperationen in einer Schleife, bis keine Übereinstimmungen mehr gefunden werden, um tief verschachtelte Muster zu behandeln. Noch besser: Verwenden Sie Allowlist-Validierung, die nur bekannt sichere Zeichen erlaubt. Verwenden Sie etablierte Sanitisierungsbibliotheken, die diese Randfälle behandeln. Testen Sie Filter mit Eingaben, die 2, 3 oder mehr Instanzen gefilterter Muster in verschiedenen Konfigurationen enthalten.

Häufige Auswirkungen

AuswirkungDetails
IntegritätBereich: Integrität

Unerwarteter Zustand - Zusätzliche ungefilterte Instanzen verursachen unbeabsichtigtes Anwendungsverhalten.
VertraulichkeitBereich: Vertraulichkeit

Anwendungsdaten lesen - Mehrere Traversal-Sequenzen ermöglichen Dateizugriff nach einfacher Entfernung.
IntegritätBereich: Integrität

Unautorisierten Code ausführen - Verbleibende Sonderzeichen ermöglichen Injection-Angriffe.

Beispielcode

Verwundbarer Code

# Verwundbar: Fehlender /g-Modifikator
my $Username = GetUntrustedInput();

# Verwundbar: Entfernt nur das ERSTE "../"
$Username =~ s/\.\.\///;

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

# Angriffseingabe: "../../../etc/passwd"
# Nach einfacher Ersetzung: "../../etc/passwd"
# Vollständiger Pfad: "/home/user/../../etc/passwd" = "/etc/passwd"
// Verwundbar: Kein 'g'-Flag in Regex
function vulnerableFilter(userInput) {
    // Verwundbar: Nur erste Übereinstimmung wird ersetzt
    return userInput.replace(/<script>/i, '');
}

// Angriff: "<<script>script>alert(1)</script>"
// Nach Filter: "<script>alert(1)</script>" - XSS erfolgreich!

Lösungscode

# Behoben: Verwende /g-Modifikator für globale Ersetzung
my $Username = GetUntrustedInput();

# Behoben: /g ersetzt ALLE Vorkommen
$Username =~ s/\.\.\///g;

# Noch besser: Schleife bis stabil für verschachtelte Muster
my $prev;
do {
    $prev = $Username;
    $Username =~ s/\.\.\///g;
} while ($Username ne $prev);

# Am besten: Allowlist-Validierung
if ($Username =~ /[^a-zA-Z0-9_-]/) {
    die "Ungültige Zeichen im Benutzernamen";
}

my $filename = "/home/user/" . $Username;
// Behoben: Verwende 'g'-Flag für globale Ersetzung
function fixedFilter(userInput) {
    // Behoben: 'g'-Flag für alle Übereinstimmungen, 'i' für Groß-/Kleinschreibung
    return userInput.replace(/<script>/gi, '').replace(/<\/script>/gi, '');
}

// Besser: Schleife bis stabil
function fixedFilterLoop(userInput) {
    const pattern = /<script[^>]*>|<\/script>/gi;
    let result = userInput;
    let prev;
    do {
        prev = result;
        result = result.replace(pattern, '');
    } while (result !== prev);
    return result;
}

Verwandte CWEs

  • CWE-792: Unvollständige Filterung einer oder mehrerer Instanzen von Sonderzeichen (Eltern)
  • CWE-794: Unvollständige Filterung mehrerer Instanzen von Sonderzeichen (Geschwister)
  • CWE-23: Relative Path-Traversal (verwandte Ausnutzung)

Referenzen

  1. MITRE Corporation. "CWE-793: Only Filtering One Instance of a Special Element." https://cwe.mitre.org/data/definitions/793.html
  2. MDN Web Docs. "String.prototype.replace()." https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
  3. OWASP. "Path Traversal." https://owasp.org/www-community/attacks/Path_Traversal