Lateral SQL Injection: Neue Erkenntnisse

SQL Injection ist ein Verfahren, über eine Anwendung, die den Zugriff auf die Datenbank bereitstellt, eigene Datenbankbefehle einzuschleusen. Jeder Entwickler, der sicherheitsrelevante DB-Anwendungen schreibt und dabei dynamisch generiertes SQL einsetzt, sollte mit diesem Angriffsszenario und den Gegenmaßnahmen vertraut sein.

David Litchfield von databasesecurity.com hat bereits 2008 eine spezielle Form von SQL Injection in Oracle demonstriert, die er „Lateral Injection“ nannte. Das Verfahren hat es ermöglicht, in PL/SQL-Prozeduren trotz korrekt typisierter Parameter mit Hilfe von NLS_DATE_FORMAT schadhaften Code in dynamisches SQL einzuschleusen. Diese Woche nun wies er auf ein neues Whitepaper hin, das aufzeigt, daß auch NUMBER-Parameter mit Hilfe von NLS_NUMERIC_CHARACTERS dergestalt manipuliert werden können, daß die Ausführung fremder Funktionen möglich wird.

Gegenmaßnahmen:

  1. Statisches SQL in PL/SQL-Routinen verwenden. Hier ist natürlich keine Umgestaltung durch Injection möglich.
  2. Wenn dynamisches SQL benötigt wird, dann müssen alle Variablen als Binds ausgeführt werden, statt eine String-Konkatenation zu verwenden. Beispiel:
-- Der folgende Code ist "böse", weil durch die Manipulation des Parameters p_id
-- das ganze SQL umgeschrieben werden kann!
CREATE OR REPLACE PROCEDURE hackmich( p_id IN NUMBER ) AS
...
    my_stmt := 'SELECT * FROM meinetab WHERE id = ' || p_id;
...
END hackmich;

-- Die Verwendung von Binds verhindert das Einschleusen von Fremdcode über Parameter
CREATE OR REPLACE PROCEDURE hacknix( p_id IN NUMBER ) AS
  CURSOR cur IS SELECT * FROM meinetab WHERE id = p_id;
...
END hacknix;

-- Für DDL wäre es diese Vorgehensweise:
CREATE OR REPLACE PROCEDURE hacknix( p_id IN NUMBER ) AS
...
  EXECUTE IMMEDIATE 'CREATE TABLE a AS SELECT * FROM b WHERE id = :id' USING p_id;
...
END hacknix;

Fazit: Mit wenig Aufwand ist viel Sicherheit gewonnen!

Weblinks

Hier die beiden Dokumente von D. Litchfield:

Was ist SQL Injection?

Quelle: xkcd

Quelle: xkcd

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s