In diesem Artikel wird erklärt, wie man mit dem Penetrationstest-Tool SQLMAP prüft, ob eine Website vor SQL-Injection sicher ist.
Was ist SQL-Injection?
SQL-Injection ist eine Code-Injection-Technik, bei der ein Angreifer bösartige SQL-Abfragen ausführt, die die Datenbank einer Webanwendung steuern. Mit dem richtigen Satz von Abfragen kann ein Benutzer Zugriff auf in Datenbanken gespeicherte Informationen erlangen. SQLMAP testet, ob ein ‚GET‘-Parameter für SQL-Injection anfällig ist.
Betrachten wir zum Beispiel das folgende PHP-Code-Segment:
$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Wenn der Benutzer „value‘); DROP TABLE table;-“ als Eingabe eingibt, wird die Abfrage zu
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
was für uns unerwünscht ist, da hier die Benutzereingabe direkt mit der vorformulierten SQL-Abfrage kompiliert wird. Daher kann der Benutzer eine SQL-Abfrage eingeben, die zur Manipulation der Datenbank erforderlich ist.
Wo kann man SQLMAP verwenden?
Wenn Sie eine Web-URL der Form http://testphp.vulnweb.com/listproducts.php?cat=1 beobachten, bei der der Parameter „GET“ fett gedruckt ist, dann kann die Website für diese Art der SQL-Injektion anfällig sein, und ein Angreifer kann Zugang zu Informationen in der Datenbank erhalten. Außerdem funktioniert SQLMAP, wenn es auf PHP basiert.
Ein einfacher Test, um zu prüfen, ob Ihre Website anfällig ist, besteht darin, den Wert im Parameter „get request“ durch ein Sternchen (*) zu ersetzen. Beispiel:
http://testphp.vulnweb.com/listproducts.php?cat=*
Wenn dies zu einer Fehlermeldung wie der oben genannten führt, können wir mit Sicherheit sagen, dass die Website verwundbar ist.
Sqlmap installieren
SQLMAP wird mit Kali-Linux vorinstalliert, was die bevorzugte Wahl der meisten Penetrationstester ist. Sie können sqlmap jedoch auch auf anderen Debian-basierten Linux-Systemen installieren, indem Sie den Befehl
sudo apt-get install sqlmap
Benutzung
In diesem Artikel werden wir eine Website verwenden, die zu Demonstrationszwecken mit Schwachstellen versehen ist:
http://testphp.vulnweb.com/listproducts.php?cat=1
Wie Sie sehen können, gibt es einen GET-Anforderungsparameter (cat = 1), der vom Benutzer geändert werden kann, indem er den Wert von cat modifiziert. Diese Website könnte also für diese Art von SQL-Injection anfällig sein.
Um dies zu testen, verwenden wir SQLMAP. Um die Parameter zu sehen, die übergeben werden können, geben Sie in das Terminal ein:
sqlmap -h
Die Parameter, die wir für die grundlegende SQL-Injection verwenden werden, sind in der obigen Abbildung dargestellt. Daneben werden wir auch die Parameter -dbs und -u verwenden, deren Verwendung in Schritt 1 erläutert wurde.
Verwendung von SQLMAP zum Testen einer Website auf SQL-Injection-Schwachstellen:
- Schritt 1: Auflisten von Informationen über die vorhandenen Datenbanken
Zunächst müssen wir also die Web-URL, die wir überprüfen wollen, zusammen mit dem Parameter -u eingeben. Wir können auch den Parameter -tor verwenden, wenn wir die Website über Proxies testen wollen. Normalerweise wollen wir testen, ob es möglich ist, Zugang zu einer Datenbank zu erhalten. Dazu verwenden wir die Option -dbs. -dbs listet alle verfügbaren Datenbanken auf.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
Wir erhalten die folgende Ausgabe, die uns zeigt, dass es zwei verfügbare Datenbanken gibt. Manchmal teilt Ihnen die Anwendung mit, dass sie die Datenbank identifiziert hat, und fragt Sie, ob Sie andere Datenbanktypen testen möchten. Sie können dann ‚J‘ eingeben. Geben Sie hier ‚Y‘ ein, da wir die Webanwendung gründlich testen wollen.
Wir stellen fest, dass es zwei Datenbanken gibt, acuart und information_schema
- Schritt 2: Auflisten von Informationen über Tabellen in einer bestimmten Datenbank
Um zu versuchen, auf eine der Datenbanken zuzugreifen, müssen wir unseren Befehl leicht ändern. Wir verwenden nun -D, um den Namen der Datenbank anzugeben, auf die wir zugreifen wollen, und sobald wir Zugriff auf die Datenbank haben, wollen wir sehen, ob wir auf die Tabellen zugreifen können. Hierfür verwenden wir die Abfrage -tables. Greifen wir auf die Datenbank acuart zu.sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables
Tabellen
In der obigen Abbildung sehen wir, dass 8 Tabellen abgerufen wurden. Jetzt wissen wir also definitiv, dass die Website verwundbar ist.
- Schritt 3: Auflisten von Informationen über die Spalten einer bestimmten Tabelle
Wenn wir die Spalten einer bestimmten Tabelle anzeigen möchten, können wir den folgenden Befehl verwenden, bei dem wir -T verwenden, um den Tabellennamen anzugeben, und -columns, um die Spaltennamen abzufragen. Wir werden versuchen, auf die Tabelle „artists“ zuzugreifen.
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns
Spalten
- Schritt 4: Dump der Daten aus den Spalten
Ahnlich können wir auf die Informationen in einer bestimmten Spalte zugreifen, indem wir den folgenden Befehl verwenden, wobei -C verwendet werden kann, um mehrere durch ein Komma getrennte Spaltennamen anzugeben, und die Abfrage -dump die Daten abruftsqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump
Aus dem obigen Bild können wir sehen, dass wir auf die Daten aus der Datenbank zugegriffen haben. In ähnlicher Weise können wir bei solchen anfälligen Websites die Datenbanken buchstäblich durchforsten, um Informationen zu extrahieren
Verhindern Sie SQL-Injection
SQL-Injection kann im Allgemeinen durch die Verwendung von Prepared Statements verhindert werden. Wenn wir eine vorbereitete Anweisung verwenden, verwenden wir im Grunde eine Vorlage für den Code und analysieren den Code und die Benutzereingabe getrennt. Dabei werden die vom Benutzer eingegebene Abfrage und der Code nicht vermischt. Im Beispiel zu Beginn dieses Artikels wird die Benutzereingabe direkt in den Code eingefügt und beide werden zusammen kompiliert, so dass wir in der Lage sind, bösartigen Code auszuführen. Bei vorbereiteten Anweisungen senden wir die SQL-Abfrage mit einem Platzhalter für die Benutzereingabe und senden dann die eigentliche Benutzereingabe als separaten Befehl.
Betrachten Sie das folgende PHP-Code-Segment.
$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));
In diesem Code wird die Benutzereingabe nicht mit der vorbereiteten Anweisung kombiniert. Sie werden separat kompiliert. Selbst wenn also bösartiger Code als Benutzereingabe eingegeben wird, behandelt das Programm den bösartigen Teil des Codes einfach als String und nicht als Befehl.
Hinweis: Diese Anwendung darf nur zu Testzwecken verwendet werden
Verwandter Artikel
Basic SQL injection and mitigation
Referece:stackoverflow.com
Dieser Artikel wurde von Deepak Srivatsav verfasst. Wenn Ihnen GeeksforGeeks gefällt und Sie einen Beitrag leisten möchten, können Sie auch einen Artikel unter contribute.geeksforgeeks.org schreiben oder eine E-Mail an [email protected] senden. Sehen Sie Ihren Artikel auf der GeeksforGeeks-Hauptseite erscheinen und helfen Sie anderen Geeks.