Sebelum menjawab pertanyaan secara langsung, perlu diperhatikan bahwa meskipun penyerang hanya dapat membaca data yang seharusnya dia tidak bisa, itu biasanya masih sangat buruk. Pertimbangkan bahwa dengan menggunakan JOIN
s dan SELECT
ing dari tabel sistem (seperti mysql.innodb_table_stats
), penyerang yang memulai dengan SELECT
injeksi dan tidak ada pengetahuan lain tentang database Anda dapat memetakan skema Anda dan kemudian mengekstrak keseluruhan data yang Anda miliki di MySQL. Untuk sebagian besar database dan aplikasi, yang sudah mewakili lubang keamanan bencana.
Tetapi untuk menjawab pertanyaan secara langsung:ada beberapa cara yang saya ketahui dengan injeksi ke SELECT
MySQL dapat digunakan untuk memodifikasi data. Untungnya, mereka semua membutuhkan cukup keadaan yang tidak biasa menjadi mungkin. Semua contoh injeksi di bawah ini diberikan relatif terhadap contoh kueri injeksi dari pertanyaan:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. Kueri "bertumpuk" atau "bertumpuk".
Teknik injeksi klasik hanya menempatkan seluruh pernyataan lain setelah yang disuntikkan. Seperti yang disarankan dalam jawaban lain di sini
, Anda dapat mengatur $_GET['q']
ke 1; DELETE FROM users; --
sehingga kueri membentuk dua pernyataan yang dieksekusi secara berurutan, yang kedua menghapus semua yang ada di users
tabel.
Dalam mitigasi
Sebagian besar konektor MySQL - terutama termasuk mysql_*
PHP (tidak digunakan lagi) dan (tidak usang) mysqli_*
fungsi - sama sekali tidak mendukung kueri bertumpuk atau bertumpuk, jadi serangan semacam ini tidak akan berfungsi. Namun, beberapa melakukannya - terutama termasuk konektor PDO PHP (meskipun dukungan dapat dinonaktifkan untuk meningkatkan keamanan
).
2. Memanfaatkan fungsi yang ditentukan pengguna
Fungsi dapat dipanggil dari SELECT
, dan dapat mengubah data. Jika fungsi pengubah data telah dibuat dalam database, Anda dapat membuat SELECT
sebut saja, misalnya dengan meneruskan 0 OR SOME_FUNCTION_NAME()
sebagai nilai $_GET['q']
.
Dalam mitigasi
Sebagian besar database tidak berisi fungsi yang ditentukan pengguna - apalagi yang mengubah data - sehingga tidak menawarkan kesempatan sama sekali untuk melakukan eksploitasi semacam ini.
3. Menulis ke file
Seperti yang dijelaskan dalam makalah Muhaimin Dzulfakar (agak terlalu lancang) Eksploitasi MySQL Tingkat Lanjut
, Anda dapat menggunakan INTO OUTFILE
atau INTO DUMPFILE
klausa pada MySQL pilih untuk membuang hasilnya ke dalam file. Karena, dengan menggunakan UNION
, setiap hasil arbitrer dapat berupa SELECT
ed, ini memungkinkan penulisan file baru dengan konten arbitrer di lokasi mana pun di mana pengguna menjalankan mysqld
dapat mengakses. Bisa dibayangkan ini dapat dimanfaatkan tidak hanya untuk memodifikasi data dalam database MySQL, tetapi untuk mendapatkan akses shell ke server yang sedang berjalan - misalnya, dengan menulis skrip PHP ke webroot dan kemudian membuat permintaan untuk itu, jika Server MySQL dihosting bersama dengan server PHP.
Dalam mitigasi
Banyak faktor yang mengurangi eksploitasi praktis dari serangan yang terdengar mengesankan ini:
- MySQL tidak akan pernah membiarkan Anda menggunakan
INTO OUTFILE
atauINTO DUMPFILE
untuk menimpa file yang ada, atau menulis ke folder yang tidak ada. Ini mencegah serangan seperti membuat.ssh
folder dengan kunci pribadi dimysql
direktori home pengguna dan kemudian SSHing, atau timpamysqld
biner itu sendiri dengan versi berbahaya dan menunggu server dimulai ulang. - Paket instalasi setengah jalan yang layak akan menyiapkan pengguna khusus (biasanya bernama
mysql
) untuk menjalankanmysqld
, dan berikan izin yang sangat terbatas kepada pengguna tersebut. Dengan demikian, seharusnya tidak dapat menulis ke sebagian besar lokasi pada sistem file - dan tentu saja tidak dapat melakukan hal-hal seperti menulis ke root web aplikasi web. - Instalasi modern MySQL hadir dengan
--secure-file-priv
diatur secara default, mencegah MySQL menulis ke mana pun selain direktori impor/ekspor data yang ditentukan dan dengan demikian membuat serangan ini hampir sepenuhnya tidak berdaya... kecuali jika pemilik server sengaja menonaktifkannya. Untungnya, tidak ada yang akan sepenuhnya menonaktifkan fitur keamanan seperti itu karena itu jelas - oh tunggu apalagi .
4. Memanggil sys_exec()
fungsi dari lib_mysqludf_sys
untuk menjalankan perintah shell arbitrer
Ada ekstensi MySQL yang disebut lib_mysqludf_sys
itu - dilihat dari bintangnya di GitHub
dan pencarian Stack Overflow cepat
- memiliki setidaknya beberapa ratus pengguna. Itu menambahkan fungsi yang disebut sys_exec
yang menjalankan perintah shell. Seperti disebutkan di #2, fungsi dapat dipanggil dari dalam SELECT
; implikasinya mudah-mudahan jelas. Mengutip dari sumber
, fungsi ini "bisa menjadi bahaya keamanan" .
Dalam mitigasi
Sebagian besar sistem tidak memasang ekstensi ini.