Sichere Programmierung von Web-Anwendungen - SQL Code Injection
Zahlreiche erfolgreiche Angriffe auf bekannte Web-Anwendungen finden wöchentlich Einzug in einschlägige Medien. Grund genug bei der Entwicklung eigener Anwendung - egal ob zur rein internen Nutzung oder mit öffentlichem Zugang - sich mit den Hintergründen der "Web Application Security" zu beschäftigen.
Dies ist ein Auszug aus dem Buch und dem Onlinekurs "Sicherheit von Web-Anwendungen: Für Software-Entwickler und Software-Projektleiter".
Beschreibung
Benutzer geben Daten in eine Web-Anwendung ein, welche im Backend innerhalb eines SQL-Statements oder einer NoSQL-Abfrage verarbeitet werden. Bekannt z.B. die Suchfunktion, aber es sind allgemein alle Nutzerdaten betroffen – dies kann z.B. auch ein Username oder Passwort sein (vgl. Datenbankabfrage zur Authentifizierung).
Werden diese Nutzerdaten ungefiltert als String innerhalb des Statements verarbeitet, können Angreifer ggf. den Statement-Code selbst verändern und im Backend ausführen. Dies führt zu ungewollter Datenpreisgabe bis hin zu Daten- oder Datenbankveränderungen.
Vereinfachtes Codebeispiel mit Sicherheitslücke:
// (Java)
//
// Übernahme der Benutzereingaben durch Framework/Servlet/JSP/CGI
// ...
// Aufbau der Datenbankverbindung
// ...
Statement stm = con.createStatement();
stm.executeUpdate("UPDATE Tabelle_User SET Password=’" + strInpPasswortNeu
+ "’ WHERE (Name=’" + strInpUsername + "’) AND (Password=’"
+ strInpPasswortAlt + "’);");
→ Erklärung: Ein Eingabestring wie z.B. "Passwort123’;--" (ohne Anführungszeichen) bewirkt das Überschreiben aller Passwörter der Tabelle, da "--" bei SQL (nicht bei allen DB-Systemen) einen Codekommentar einleitet und somit der folgende Teil des Statements ignoriert wird.
Sichere Programmierung:
Es ist eine strikte Trennung zwischen Datenbank-Kommando und Nutzereingaben vorzunehmen. Dazu sind gängige Programmierkonstrukte zu nutzen. Von eigenen "Filtermethoden" ist abzusehen.
Beispiel:
// (Java)
//
// Übernahme der Benutzereingaben durch Framework/Servlet/JSP/CGI
// ...
// Aufbau der Datenbankverbindung
// ...
PreparedStatement pstm = con.prepareStatement(
"UPDATE Tabelle_User SET Password=? WHERE (Name=?) AND (Password=?);");
pstm.setString(1, strInpPasswortNeu);
pstm.setString(2, strInpUsername);
pstm.setString(3, strInpPasswortAlt);
pstm.executeUpdate();
→ Hier werden sogenannte prepared Statements verwendet:
- Systeminhärente Trennung zwischen SQL-Kommandos und Benutzereingaben
-
Unabhängig vom Datenbanksystem
→ Alternative: "Stored Procedures" auf Datenbanksystemebene! - Nutzbar in allen gängigen Sprachen und Systemen, z.B.: Java, Perl, Microsoft ADO.NET, ...
- Vergleichbare Verfahren/APIs bei NoSQL-Systemen (wenig standardisiert, aber ebenfalls überall vorhanden!)
Die API-Dokumentation der genutzten Programmierumgebung enthält weitere Details zur jeweiligen Verwendung.
Schlagworte
Sichere Programmierung, Web-/Anwendungssicherheit, Secure Programming, Web Application Security, Softwarentwicklung, Projekt-Management, Security Awareness
Kategorien: IT-Sicherheit Hintergrundartikel Programmieren/Java
Kommentare
Eigenen Kommentar hinzufügen
Teilen / Weiterempfehlen
Wenn Sie diese Seite gut finden, teilen Sie es doch ihren Kontakten mit: