
SQL-Injection-Ausnutzungstool
#BBQSQL# Ein Tool zur Ausnutzung von Blind-SQL-Injection
Blind-SQL-Injection kann eine lästige Sache sein. Wenn die verfügbaren Tools funktionieren, funktionieren sie gut, aber wenn nicht, muss man etwas Eigenes schreiben. Das ist zeitaufwändig und mühsam. BBQSQL kann Ihnen helfen, diese Probleme zu lösen.
BBQSQL ist ein Blind-SQL-Injection-Framework, das in Python geschrieben ist. Es ist äußerst nützlich, wenn man knifflige SQL-Injection-Schwachstellen angreift. BBQSQL ist auch ein halbautomatisches Tool, das eine ziemlich umfangreiche Anpassung für schwer auslösbare SQL-Injection-Befunde ermöglicht. Das Tool ist datenbankunabhängig konzipiert und extrem vielseitig. Es verfügt außerdem über eine intuitive Benutzeroberfläche, die die Einrichtung von Angriffen wesentlich erleichtert. Python gevent wird ebenfalls implementiert, was BBQSQL extrem schnell macht.
Wir haben versucht, das Tool so zu schreiben, dass es bei der Einrichtung eines Angriffs in der Benutzeroberfläche sehr selbsterklärend ist. Der Vollständigkeit halber haben wir jedoch eine detaillierte Readme beigefügt, die Ihnen zusätzliche Einblicke in die Einzelheiten der einzelnen Konfigurationsoptionen geben soll. Beachtenswert ist, dass jede Konfigurationsoption in der Benutzeroberfläche eine zugehörige Beschreibung hat. Wenn Sie sich also entscheiden, das Tool ohne das Lesen dieser Seite zu starten, sollten Sie in der Lage sein, sich durch einen Angriff zu hacken.
Ähnlich wie bei anderen SQL-Injection-Tools stellen Sie bestimmte Anforderungsinformationen bereit.
Folgende übliche Informationen müssen bereitgestellt werden:
Dann geben Sie an, wo die Injection erfolgt und welche Syntax wir injizieren. Lesen Sie weiter für Details.
Dies sollte unkompliziert sein, aber was auch immer. Versuchen Sie, Folgendes auszuführen:
sudo pip install bbqsql
Wenn das nicht funktioniert, können Sie es aus dem Quellcode installieren. Das Tool benötigt gevent, requests.
Im Menü sehen Sie einen Platz für BBQSQL-Optionen. Hier geben Sie die folgenden Optionen an:
Dies wird unten im Abfragesyntax-Überblick ausführlicher beschrieben.
Der Name einer Datei, in die die Ergebnisse ausgegeben werden sollen. Lassen Sie dies leer, wenn Sie keine Ausgabe in eine Datei wünschen.
BBQSQL verwendet zwei Techniken bei der Durchführung eines Blind-SQL-Injection-Angriffs. Die erste und standardmäßig verwendete Technik ist binary_search. Siehe Wikipedia für weitere Informationen.
Die zweite Technik, die Sie verwenden können, ist frequency_search. Die Häufigkeitssuche basiert auf einer Analyse der englischen Sprache, um die Häufigkeit zu bestimmen, mit der ein Buchstabe vorkommt. Diese Suchmethode ist bei nicht-entropischen Daten sehr schnell, kann aber bei nicht-englischen oder verschleierten Daten langsam sein.
Sie können entweder binary_search oder frequency_search als Wert für diesen Parameter angeben.
Dies gibt die Art der SQL-Injection an, die Sie entdeckt haben. Hier können Sie festlegen, welches Attribut der HTTP-Antwort BBQSQL untersuchen soll, um wahr/falsch zu bestimmen.
Sie können angeben: status_code, url, time, size, text, content, encoding, cookies, headers oder history
Wenn Sie eine SQL-Injection identifiziert haben, die zu einem anderen Server-Statuscode führt, setzen Sie hier 'status_code'. Wenn das Cookie anders ist, setzen Sie 'cookie'. Wenn die Antwortgröße unterschiedlich ist, setzen Sie 'size'. Sie verstehen das Prinzip.
Die Nebenläufigkeit basiert auf der gevent-Bibliothek in Python. Funktional erscheint sie wie Threading, aber die Einzelheiten ihrer Funktionsweise können in unserem DefCon-Vortrag hier [Link einfügen] eingesehen werden. Diese Einstellung steuert den Grad der Nebenläufigkeit, mit dem der Angriff ausgeführt wird. Dies ist nützlich, um die Anzahl der Anfragen zu drosseln und die Angriffszeiten zu beschleunigen. Bei wirklich leistungsstarken Webservern wie nginx konnten wir die Nebenläufigkeit auf 75 einstellen. Standardmäßig ist dies auf '30' gesetzt.
Wenn Sie auf eine SQL-Injection-Schwachstelle mit seltsamen Eigenheiten stoßen (z. B. bestimmte Zeichen können nicht enthalten sein oder Funktionen wie ASCII/CHAR funktionieren nicht), haben Sie sich wahrscheinlich dabei ertappt, ein Skript mit Ihrer benutzerdefinierten Injektionssyntax zu schreiben. BBQSQL nimmt den Skriptteil ab und bietet eine Möglichkeit, Ihre benutzerdefinierte Abfragesyntax einzufügen und mit Leichtigkeit auszunutzen.
Der Abfrageeingabebereich ist der Ort, an dem Sie Ihre Abfrage konstruieren, die zum Extrahieren von Informationen aus der Datenbank verwendet wird. Es wird davon ausgegangen, dass Sie bereits eine SQL-Injection an einem anfälligen Parameter identifiziert und eine erfolgreiche Abfrage getestet haben.
Unten finden Sie ein Beispiel für eine Abfrage, die Sie verwenden können, um Ihre Abfrage zu erstellen.
In diesem Beispiel möchte der Angreifer die Datenbankversion auswählen:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
Die Abfragesyntax basiert auf Platzhaltern, die BBQSQL mitteilen, wie der Angriff ausgeführt werden soll.
Sie müssen die folgenden Platzhalterinformationen bereitstellen, damit der Angriff funktioniert. Sobald Sie diese in Ihre Abfrage eingefügt haben, erledigt BBQSQL den Rest:
${row_index}: Dies teilt BBQSQL mit, hier Zeilen zu iterieren. Da wir LIMIT verwenden, können wir je nach ${row_index}-Wert n Zeilen anzeigen.
${char_index}: Dies teilt BBQSQL mit, welches Zeichen aus der Unterabfrage abgefragt werden soll.
${char_val}: Dies teilt BBQSQL mit, wo die Ergebnisse aus der Unterabfrage verglichen werden sollen, um das Ergebnis zu validieren.
${comparator}: Hiermit teilen Sie BBQSQL mit, wie die Antworten verglichen werden sollen, um festzustellen, ob das Ergebnis wahr oder falsch ist. Standardmäßig wird das Symbol > verwendet.
${sleep}: Dies ist optional, teilt BBQSQL aber mit, wo die Anzahl der Sekunden eingefügt werden soll, die bei zeitbasierter SQL-Injection gewartet werden soll.
Nicht alle dieser Platzhalter sind erforderlich. Wenn Sie beispielsweise eine halbblinde boolesche SQL-Injection entdeckt haben, können Sie den Parameter ${sleep} weglassen.
BBQSQL hat viele HTTP-Parameter, die Sie konfigurieren können, wenn Sie Ihren Angriff einrichten. Mindestens müssen Sie die URL, den Ort, an dem die Injektionsabfrage ausgeführt werden soll, und die Methode angeben. Die folgenden Optionen können gesetzt werden:
Sie geben an, wo die Injektionsabfrage eingefügt werden soll, indem Sie die Vorlage ${injection} verwenden. Ohne die Injektionsvorlage weiß das Tool nicht, wo die Abfrage eingefügt werden soll.
Geben Sie Dateien an, die mit der Anfrage gesendet werden sollen. Setzen Sie den Wert auf den Pfad und BBQSQL kümmert sich um das Öffnen/Einbinden der Datei.
HTTP-Header, die mit den Anfragen gesendet werden sollen. Dies kann ein String oder ein Dictionary sein. Zum Beispiel:
{"User-Agent":"bbqsql"}
oder
"User-Agent: bbqsql"
Ein Dictionary oder ein String von Cookies, die mit der Anfrage gesendet werden sollen. Zum Beispiel:
{"PHPSESSIONID":"123123"}
oder
PHPSESSIONID=123123;JSESSIONID=foobar
Geben Sie eine URL an, an die die Anfragen gesendet werden sollen.
Dies ist ein Boolean, der bestimmt, ob HTTP-Weiterleitungen beim Senden von Anfragen gefolgt werden.
Geben Sie einen HTTP-Proxy an, der für die Anfrage als Dictionary verwendet werden soll. Zum Beispiel:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
Geben Sie POST-Daten an, die zusammen mit der Anfrage gesendet werden sollen. Dies kann ein String oder ein Dictionary sein. Zum Beispiel:
{"input_field":"value"}
oder
input_field=value
Geben Sie die Methode für die HTTP-Anfrage an. Gültige Methoden sind
'get','options','head','post','put','patch','delete'
Geben Sie ein Tupel aus Benutzername und Passwort an, das für die HTTP-Basisauthentifizierung verwendet werden soll. Zum Beispiel:
("myusername","mypassword")
Nachdem Sie Ihren Angriff in der Benutzeroberfläche eingerichtet haben, können Sie die Konfigurationsdatei exportieren. Die Option wird angezeigt, wenn Sie das Tool ausführen. Die exportierte Konfigurationsdatei verwendet ConfigParser und ist leicht lesbar. Eine Beispielkonfigurationsdatei ist unten zu sehen:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
Dies ist nützlich, wenn Sie einen Angriff fortsetzen oder vielleicht nur die Abfrage anpassen möchten, ohne den Aufwand der Neukonfiguration aller Optionen.
Sie können auch eine Konfiguration von der Befehlszeile oder aus der Benutzeroberfläche importieren. Um eine Konfiguration von der Befehlszeile zu importieren, führen Sie bbqsql einfach mit den folgenden Optionen aus:
bbqsql -c config_file
Wenn Sie eine Konfigurationsdatei laden, werden dieselben Validierungsroutinen auf die Parameter angewendet, um sicherzustellen, dass sie gültig sind.
Manchmal müssen Sie etwas wirklich Verrücktes tun. Vielleicht müssen Sie die Werte, die in ein Feld eingegeben werden, verschlüsseln, bevor Sie die Anfrage senden, oder vielleicht müssen Sie eine dreifache URL-Kodierung durchführen. Unabhängig davon machen solche Situationen andere Tools unbrauchbar. BBQSQL ermöglicht es Ihnen, "Hook"-Funktionen zu definieren, die das Tool an verschiedenen Stellen während der Anfrage aufruft. Sie können beispielsweise eine pre_request-Funktion angeben, die die Anfrage als Argument nimmt, die erforderlichen Mutationen durchführt und die modifizierte Anfrage zur weiteren Verarbeitung an den Server zurückgibt.
Um dies umzusetzen, erstellen Sie eine Python-Datei und definieren Sie Hook-Funktionen. Die verfügbaren Funktionsnamen sind unten aufgeführt. In Ihrer Hooks-Datei können Sie so viele oder so wenige dieser Hook-Funktionen definieren, wie Sie möchten. Anschließend können Sie im Abschnitt bbqsql_options des Menüs den Speicherort Ihrer hooks_file angeben. BBQSQL wird diese Datei einlesen und die von Ihnen definierten Hooks verwenden.
Es ist wichtig, dass die von Ihnen angegebenen Hook-Funktionen exakt die unten angegebenen Namen haben, da BBQSQL sonst nicht weiß, welcher Hook wann aufgerufen werden soll. Die args-Funktion erhält einen Parameter, der alle Argumente enthält, die zum Erstellen der HTTP-Anfrage verwendet werden. Die pre_request-Funktion erhält das Request-Objekt, bevor es gesendet wird. Die post_request-Funktion erhält das Request-Objekt, nachdem es gesendet wurde. Die response-Funktion erhält das Antwortobjekt, bevor es an BBQSQL zurückgegeben wird.
Die folgenden Hooks sind verfügbar:
args: Ein Dictionary der Argumente, die an Request() gesendet werden.
pre_request: Das Request-Objekt, unmittelbar bevor es gesendet wird.
post_request: Das Request-Objekt, unmittelbar nachdem es gesendet wurde.
response: Die Antwort, die von einer Request generiert wurde.
Weitere Informationen zur Funktionsweise dieser Hooks und zum Aussehen Ihres hooks-Dictionaries finden Sie in der Dokumentation der Requests-Bibliothek zu Hooks
Eine Beispiel-Hooks-Datei könnte wie folgt aussehen:
# datei: hooks.py
import time
def pre_request(req):
"""
Dieser Hook ersetzt einen Platzhalter durch die aktuelle Zeit.
Erwartet, dass die URL wie folgt aussieht:
http://www.google.com?k=v&time=PLATZHALTER
"""
req.url = req.url.replace('PLATZHALTER',str(time.time()))
return req
Reichen Sie Fehlerkorrekturen oder Feature-Anfragen unter https://github.com/Neohapsis/bbqsql/ ein.
Bitte! Wir sehen dies als großartigen Ausgangspunkt, um ein voll funktionsfähiges SQL-Injection-Framework zu entwickeln. Zögern Sie nicht, den Code zu forken, und wir können Ihre Änderungen zusammenführen, wenn sie nützlich sind.
BBQ ist absolut köstlich und SQL-Injection ebenfalls!