FlawOpen

flawopen.com/SQL Injection

SQL Injection

Kritis CWE-89
Bahasa: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia

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

Langkah 1

Input sampai ke kueri

Field formulir, parameter URL, header, atau field API diberikan ke kode yang menyusun perintah SQL.

Langkah 2

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.

Langkah 3

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.

Langkah 4

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

Python JavaScript Go Java PHP C# Ruby C/C++ Rust Kotlin Swift

Daftar Periksa Penguatan Sistem Rekayasa

Sumber

Bacaan terkait

Kueri berparameter dijelaskan Apakah ORM saja cukup? Apakah stored procedure mencegah SQL injection? SQL injection di MOVEit Transfer (2023) Injeksi psql PostgreSQL (2024)