it-swarm.com.de

SQL-Injection: So finden Sie URLs, auf die Sie angreifen können

In den letzten Tagen habe ich über SQL injection Gelesen und die meisten Beispiele für url, die ich sehe, sind wie folgt:

get_int_filtered.php?id=1
get_int_groupby.php?id=1
get_int_having.php?id=1
get_int_img.php?id=1
get_int_inline.php?id=SELECT+name+FROM+users

(Das Obige ist ein kleines Beispiel in: sqlmapproject/testenv )

Mir fehlt der Teil, wie jemand diese URLs entdeckt, auf die er angreifen kann. Ist es eine manuelle Aufgabe? Wenn Sie beispielsweise die Browser-Entwicklertools überprüfen, um die Aufrufe des Backends/REST api einer Website) anzuzeigen, gibt es ein Tool, mit dem eine Website gescannt und eine Liste mit urls und HTTP methods zum Ausprobieren (als zweiter Schritt)?

6
tgogos

SQL Injection: So finden Sie URLs, die für SQL Injection-Angriffe schwach sind.

Zuerst müssen Sie die verschiedenen Arten von SQLi verstehen, hier .

Ich werde hier über In-Band Injection sprechen, den Klassiker. unterteilt in 2 Typen:

  • Fehlerbasiertes SQLi
  • UNION-basiertes SQLi

Fehlerbasiertes SQLI

Ziel : Sammeln von Datenbankstrukturinformationen durch Anzeigen von SQL-Fehlern auf der Zielwebsite. In einigen Fällen können Sie die gesamte Datenbank mit diesen auflisten.

Suchen einer schwachen URL : Verwenden von Google Dorks. Ja, Google hilft Ihnen dabei, schwache URLs zu finden.

  • beispiel: inurl:"product.php?id=" site:.ru

Hier bitten Sie Google, die russische Website mit product.php?id= In der URL aufzulisten.

Warum?

Weil wir eine Seite finden wollen, die direkt mit der Datenbank kommuniziert. In den meisten Fällen möchten Sie nach folgenden Mustern suchen: *.php?parameter=n

Okay, aber woher weiß ich, dass diese URL für SQLi schwach ist?

Sie müssen ein ' Oder %27 Direkt nach der Parameternummer eingeben und die Eingabetaste drücken:

  • http[:]//w34ksite.com/product.php?id=1'

Wenn ein SQL-Fehler auftritt, besteht eine gewisse Wahrscheinlichkeit, dass diese Website injizierbar ist.


UNION-basiertes SQLI

Ziel: Nutzt den UNION SQL-Operator, um die Ergebnisse von zwei oder mehr SELECT-Anweisungen zu einem einzigen Ergebnis zu kombinieren.

Der folgende Block ist ein Material, das ich für meine infoSec-Schüler geschrieben habe. (Offensive Sicherheitsklasse)

schwache Stelle:

http://w34ksite.com

erster Schritt

Suchen Sie eine URL, die möglicherweise SQL-Abfragen sendet, wie diese:

http://w34ksite.com/products.php?category=1 Diese URL listet Produkte auf, die in der Kategorie 1 neu gruppiert sind

Denken Sie daran, dass eine URL, die mit * ? * = * Endet, in den meisten Fällen mit einer SQL-Datenbank kommuniziert. Wir möchten dies ausnutzen.

Der zweite Schritt

Übersetzen Sie den Teil products.php?category=1 Der URL in eine SQL-Abfrage. Ja, in diesem Szenario (und auf vielen Websites in der Produktion) ist diese URL eine getarnte SQL-Abfrage:

products.php? category = 1 -> SELECT * FROM products WHERE category=1

Der dritte Schritt

Können wir den Kategorieparameter einfügen? Versuchen wir, die Produktliste zu sortieren, indem wir beispielsweise ORDER BY n Hinzufügen:

http://w34ksite.com/products.php?category=1 ORDER BY 1 Nichts ändert sich.

http://w34ksite.com/products.php?category=1 ORDER BY 2 Wow! Die Produktbestellung hat sich geändert! Wir können wahrscheinlich Sachen spritzen!

Die Zahl n in ORDER BY n Gibt an, nach welcher Spaltennummer der Tabelle Sie die Ausgabe sortieren (in diesem Fall die Tabellenspalte 2 des Produkts )). Warten Sie also eine Minute. Was passiert, wenn ich eine Zahl eingebe, die die maximale Anzahl der Tabellen überschreitet? Lass es uns versuchen.

http://w34ksite.com/products.php?category=1 ORDER BY 3 Bestelländerungen erneut.

http://w34ksite.com/products.php?category=1 ORDER BY 4 Wow! Leere Seite! Wir können daraus schließen, dass die Produkttabelle 3 Spalten enthält. Diese Informationen sind für die Verwendung des Operators SQL UNION ALL von entscheidender Bedeutung.

Der vierte Schritt

Den Angriff planen. So möchten wir beispielsweise die in dieser Datenbank geschriebenen E-Mail-Adressen sichern. Und natürlich befinden sich die E-Mail-Einträge nicht in der Produkttabelle. Sie sollten sich an einer anderen Stelle befinden ... Sie können den Namen der Tabelle und mehr erraten, wenn SQL-Fehler direkt auf der Webseite angezeigt wird, aber diesmal kein Glück, auf w34ksite.com wird kein SQL-Fehler angezeigt. Nehmen wir also an, die Tabelle der E-Mail heißt email, da wir wissen, dass dies der Tabellenname dieser CMS-Standard-E-Mail ist.

SELECT * FROM email -> http://w34ksite.com/email.php? Natürlich nicht. Wer wird verrückt genug sein, um eine PHP Seite, auf der die E-Mail-Adresse der Datenbank aufgelistet ist? Warum nicht password.php?

Vergessen Sie nicht, dass products.php?category=1 Unser Schlüssel ist, um mit der Datenbank zu kommunizieren und Dinge zu injizieren. Dieser Schlüssel öffnet die Datenbanktür. Die allgemeine Idee ist, diesen Schlüssel zum Anzeigen des Inhalts der E-Mail-Tabelle zu verwenden. Warum also nicht den Inhalt der Produkttabelle (products.php? Category = 1) und den Inhalt der E-Mail-Tabelle anzeigen? Ja, das werden wir tun. Mit dem Operator NION ALL.

Die UNION ALL ist sehr nützlich. Sie können eine andere SQL-Anforderung verwenden, indem Sie sie verwenden. Lassen Sie uns diesen URL-Teil beispielsweise erneut in SQL übersetzen:

products.php? category = 1 -> SELECT * FROM products WHERE category=1 richtig?

Wir werden nun die neue Abfrage mit dem Operator UNION ALL hinzufügen und versuchen, die E-Mail-Tabelle abzurufen:

SELECT * FROM products WHERE category=1 UND UNION ALL SELECT *, NULL, NULL FROM email

Wir sollten so etwas haben:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

Warte, was ist das *, NULL, NULL?

Erinnern Sie sich an den http://w34ksite.com/products.php?category=1 ORDER BY 4 Zum Testen, ob wir etwas injizieren können? Wir erhalten eine sehr wertvolle Information: Die Anzahl der Spalten der Produkttabelle. Bei Verwendung des Operators UNION ALL Muss die Spaltennummer der Tabelle identisch sein.

  • NULL: Eine leere Spalte fälschen.
  • ,: Trennen Sie eine Spalte von einer anderen
  • *: Einträge dieser Spalte anzeigen

Wenn nichts passiert, versuchen Sie, den * So zu bewegen:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, *, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, NULL, * FROM email

11
Baptiste