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
| Auswirkung | Details |
|---|---|
| Integrität | Bereich: Integrität Unerwarteter Zustand - Ungefilterte Sonderzeichen veranlassen die Anwendung, unbeabsichtigte Zustände zu erreichen oder unbeabsichtigte Operationen auszuführen. |
| Vertraulichkeit | Bereich: Vertraulichkeit Anwendungsdaten lesen - Path-Traversal durch unvollständige Filterung legt sensible Dateien offen. |
| Integrität | Bereich: 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
- MITRE Corporation. "CWE-791: Incomplete Filtering of Special Elements." https://cwe.mitre.org/data/definitions/791.html
- OWASP. "Input Validation Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
- OWASP. "Testing for Filter Bypass." OWASP Testing Guide.