Sichere Programmierung von Web-Anwendungen - SQL Code Injection

Hinzugefügt am 20.11.2020 von Frank Hissen

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:

Mail Facebook Twitter Pinterest LinkedIn
reddit Digg StumbleUpon XING
WhatsApp Telegram