Liste Neuigkeiten Hintergrundartikel Kommentare Programmieren/Java IT-Sicherheit Computer Ratgeber & Tipps

Sichere Programmierung von Web-Anwendungen - SQL Code Injection

Hinzugefügt am 20.11.2020 von Frank Hißen

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 "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:

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