Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Injeksi MySQL - Gunakan kueri SELECT untuk MEMPERBARUI/HAPUS

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 atau INTO DUMPFILE untuk menimpa file yang ada, atau menulis ke folder yang tidak ada. Ini mencegah serangan seperti membuat .ssh folder dengan kunci pribadi di mysql direktori home pengguna dan kemudian SSHing, atau timpa mysqld 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 menjalankan mysqld , 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. klausa IN di mysql nodejs

  2. MySQL menghitung tanggal berturut-turut untuk rentetan saat ini

  3. Masukkan teks persia di tabel mysql

  4. Menyimpan id facebook sebagai int atau varchar?

  5. Pengambilan PDO tidak menghasilkan apa-apa