it-swarm.com.de

Woher wissen, welche Datenbank sich hinter einer Webanwendung befindet?

Ich habe gelesen, dass verschiedene Datenbanken (MySQL, SQL Server, ...) unterschiedliche Sicherheitslücken aufweisen und für bestimmte SQL-Injektionen anfällig sind.

Wenn ein Angreifer versucht, einen Datenbankangriff auf eine Website durchzuführen (z. B. SQL Injection), identifiziert er zunächst die Art der Datenbank und denkt anschließend an die erkannte Datenbank.

Wie wird diese vorherige Inspektion vom Angreifer durchgeführt? Verwenden Sie spezielle Abfragen? Gibt es spezielle Tools? Ich habe keine Informationen dazu gefunden.

14
user674887

Angenommen, Sie haben eine solche Abfrage:

$q="SELECT username, joindate FROM users WHERE username LIKE '%" . $search . "%' LIMIT 20";

Stellen Sie sich nun vor, Sie steuern $search Über einen Parameter. Normalerweise werden die Benutzerkennwörter im Feld joindate wie folgt zurückgegeben:

$search="' UNION SELECT username, password FROM users; -- -";

Als solches wird die Abfrage:

SELECT username, joindate FROM users WHERE username LIKE '%' UNION SELECT username, password FROM users; -- - %' LIMIT 20

Der Teil nach dem doppelten Bindestrich ist ein Kommentar, daher wird er ignoriert, und alle Kombinationen aus Benutzername und Kennwort werden nach den legitimen Datensätzen am Ende des Datensatzes als neue Datensätze angehängt. Genial!

Aber jetzt wollen wir dies anpassen, damit wir den Datenbanknamen für die weitere Untersuchung ihrer Datenbank finden können. Unter MySQL können wir die Funktion DATABASE() verwenden:

$search="' UNION SELECT DATABASE(), 1; -- -";

Die Verwendung von 1 Hier dient zum Auffüllen des Feldes joindate, das wir nicht verwenden.

Unter MSSQL können wir genau das Gleiche tun, aber mit DB_NAME():

$search="' UNION SELECT DB_NAME(), 1; -- -";

Bei beiden Tricks wird eine einzelne Zeile an das Ende der Ergebnismenge angehängt, die den Datenbanknamen enthält.

Wir können diesen Trick dann erweitern, um VERSION() unter MySQL oder @@VERSION Unter MSSQL zu verwenden, wodurch die aktuelle Datenbankversion zurückgegeben wird. Für Oracle und PL/SQL können Sie die Existenz der Tabelle v$version Überprüfen, indem Sie einfach eine Abfrage durchführen und nach einem Fehler suchen.

12
Polynomial

Zusätzlich zu den anderen Antworten sind Unterschiede in der Syntax zwischen Datenbank-Engines eine Methode, die ich für das Fingerabdrucken von Datenbanken verwende (insbesondere wenn die Injektion blind ist und keine Daten zurückgegeben werden). Auf Folie 34 von diese Präsentation befindet sich ein gutes Beispiel, das ich normalerweise verwende.

Ein gutes Beispiel ist also die Verkettung von Zeichenfolgen. MS-SQL und DB2 verwenden +, während Oracle PL/SQL und PostGRES || verwenden, sodass Sie dies in Zeichenfolgen einfügen und das Verhalten der Anwendung beobachten können. Wenn es sich so verhält, als wäre die Zeichenfolge verkettet worden, handelt es sich möglicherweise um eine Injektion.

9
Rory McCune

Eine der einfachsten Möglichkeiten für einen Angreifer, festzustellen, welche Datenbank von einer Anwendung verwendet wird, besteht darin, dass die Anwendung bei einer Datenbankabfrage auf irgendeine Weise einen Fehler verursacht.

Wenn dann die Fehlerbehandlung in der Anwendung nicht aktiviert ist (was häufig nicht der Fall ist), wird der Datenbankfehler angezeigt. Diese sind normalerweise sehr detailliert und Sie können die Datenbank daraus bestimmen.

Es ist auch eine Überlegung wert, wenn Sie eine der folgenden Sprachen kennen, in denen die Webanwendung geschrieben ist, das verwendete Framework, die verwendete Plattform, den Hosting-Anbieter e.t.c. Sie alle können dabei helfen, herauszufinden, welche Datenbank verwendet wird. Zum Beispiel, wenn sie asp verwenden, verwenden sie höchstwahrscheinlich MSSQL und wenn sie PHP höchstwahrscheinlich MySQL verwenden. Dies ist offensichtlich nicht die ganze Zeit wahr, aber wenn Sie raten müssen, um a zu sagen Blind SQL Injection Attack ist eine andere Möglichkeit, die Dinge einzugrenzen.

4
Mark Davidson

Hierfür gibt es eine Reihe von Methoden. Beachten Sie jedoch, dass Sie den Datenbanktyp nicht kennen müssen, um einen Angriff auszuführen. Das Wissen darüber kann zusätzliche oder alternative Angriffsvektoren bereitstellen, ist jedoch für die SQL-Injection nicht erforderlich.

Die meisten Datenbanken bieten Funktionen oder Wörterbuchgeschichten, mit denen der Datenbanktyp und die Version identifiziert werden können. Diese unterscheiden sich zwischen den Anbietern. Vorausgesetzt, Sie haben einen allgemeinen SQL-Injection-Punkt gefunden, können Sie jeden einzelnen ausprobieren, bis Sie eine gültige Antwort erhalten.

Es gibt auch syntaktische Unterschiede zwischen vielen verschiedenen Dialekten von SQL. Beispielsweise verfügt Oracle über die Syntax (+), um äußere Verknüpfungen darzustellen. Es gibt häufig geringfügige Unterschiede bei den verfügbaren Datentypen, z. B. beim Texttyp von Postgres (den Oracle nicht hat) oder beim Umgang mit Sequenzen/automatisch inkrementierenden Spalten usw.

Manchmal können Sie dies erkennen, indem Sie nur Datenbanktreiber- oder Connector-Details abrufen. Je nach Umgebung, Sprache usw. kann dies trivial sein oder auch nicht.

0
Tim X