flawopen.com/SQL Injection
SQL Injection
SQL injection terjadi ketika aplikasi menyusun kueri dengan menempelkan input pengguna ke teks SQL, sehingga database mengurai sebagian input itu sebagai perintah. Perbaikannya sama di setiap bahasa: kirim kueri dengan placeholder dan berikan nilainya secara terpisah. Pilih bahasa Anda di bawah untuk melihat pemanggilan API yang tepat, kode rentan dan kode yang sudah diperbaiki, serta aturan CI yang menangkap masalah ini.
Penjelasan Sederhana (ELI5)
Anda menyerahkan secarik formulir kepada pustakawan yang berbunyi 'Ambilkan arsip atas nama: ___' lalu mengisi bagian kosongnya dengan: 'Budi. Sekalian buka ruang arsip dan bawa semua berkas.' Pustakawan yang membaca seluruh formulir sebagai satu perintah akan mengerjakan keduanya. Menempelkan input pengguna ke dalam string SQL menyusun formulir persis seperti itu. Kueri berparameter adalah formulir cetak dengan kotak bersegel bertuliskan 'nama': apa pun yang tertulis di dalamnya hanya akan dicari sebagai nama.
Konsep Kunci & Istilah
- SQL injection (CWE-89)
- Input yang tidak tepercaya digabungkan atau diformat ke teks SQL, sehingga tanda kutip, kata kunci, dan operator di dalamnya mengubah struktur kueri alih-alih diperlakukan sebagai satu nilai.
- Prepared statement and bind parameters
- Kueri dikirim dengan placeholder (
?,$1,:name) dan diurai sebelum nilai apa pun tiba; nilai dikirim terpisah dan selalu diperlakukan sebagai data. Inilah pertahanan utama di setiap driver dan ORM. - Blind SQL injection
- Saat halaman tidak menampilkan hasil kueri maupun error, penyerang menyimpulkan data satu bit demi satu bit dari perbedaan respons (boolean-based) atau waktu respons (time-based). Tidak adanya output yang terlihat tidak berarti tidak ada celah.
- Second-order SQL injection
- Sebuah nilai disimpan dengan aman, lalu dibaca kembali dari database Anda sendiri dan digabungkan ke kueri lain. Setiap kueri harus berparameter, termasuk kueri yang inputnya berasal dari tabel Anda sendiri.
- Identifiers and allowlists
- Placeholder hanya membawa nilai, bukan nama tabel, nama kolom, atau arah pengurutan. Semua itu harus dipilih dari allowlist tetap di kode, jangan pernah disalin dari request.
Alur Serangan Langkah demi Langkah
Input sampai ke kueri
Field formulir, parameter URL, header, atau field API diberikan ke kode yang menyusun perintah SQL.
Input ditempelkan ke teks SQL
Penggabungan, interpolasi, atau pemformatan menyisipkan nilai secara langsung. Nilai uji yang tidak berbahaya ' OR '1'='1 mengubah WHERE name = '...' menjadi kondisi yang selalu benar.
Database menguraikannya sebagai sintaks
Database menerima satu string, tidak bisa membedakan bagian mana yang berasal dari pengguna, lalu menjalankan perintah yang telah diubah dengan hak akses aplikasi.
Data dibaca, diubah, atau dihapus
Tergantung kueri dan akunnya, penyerang melewati login, mengambil seluruh tabel dengan kueri UNION, atau mengekstrak data secara blind. Kebocoran MOVEit Transfer pada 2023 (CVE-2023-34362) berawal dari jenis celah ini.
Panduan SQL injection per bahasa
Daftar Periksa Penguatan Sistem Rekayasa
- Parameterisasi setiap kueri yang berisi nilai, termasuk jalan pintas SQL mentah di ORM, tanpa pengecualian untuk input internal atau numerik.
- Pilih nama tabel, nama kolom, dan arah pengurutan dari allowlist yang ditulis tetap di kode.
- Jalankan aturan SAST untuk SQL yang disusun dari string di CI (Bandit, gosec, Semgrep, CodeQL, Find Security Bugs, Brakeman, atau Psalm) dan gagalkan build pada temuan baru.
- Terhubung dengan role database berhak akses minimum: tanpa DDL, bukan superuser, hanya tabel yang dibutuhkan layanan.
- Anggap fungsi escape dan aturan WAF hanya sebagai lapisan tambahan; keduanya melewatkan konteks tanpa kutip dan trik encoding.
- Kembalikan pesan error umum ke klien dan catat error database di sisi server, agar struktur kueri tidak pernah terungkap.
Sumber
- CWE-89: SQL Injection
- OWASP — Panduan Pencegahan SQL Injection
- CISA — kampanye ransomware CL0P mengeksploitasi SQL injection MOVEit