Selamat datang di panduan pembelajaran SQL Injection dan pengujian menggunakan tool sqlmap. Panduan ini dirancang untuk memberikan pemahaman menyeluruh mulai dari konsep dasar hingga cara perbaikan query secara aman.
1. Apa itu SQL Injection (SQLi)?
SQL Injection (SQLi) adalah kerentanan keamanan web yang terjadi ketika kode pengembang secara tidak sengaja mengizinkan input dari pengguna untuk digabungkan langsung ke dalam perintah/query SQL tanpa sanitasi atau parameter binding.
Akibatnya, penyerang dapat menyisipkan karakter atau perintah SQL buatan (seperti ' OR '1'='1 atau UNION SELECT) yang akan diinterpretasikan oleh server database sebagai perintah resmi, bukan lagi sekadar data.
2. Parameter GET vs Parameter POST
GET Parameter
Nilai dikirim melalui URL baris browser (contoh: sqli.php?id=1). Sangat mudah diamati dan diuji langsung. Di sqlmap diuji menggunakan opsi -u "http://localhost/...".
POST Parameter
Nilai dikirim di dalam HTTP Request Body (contoh: formulir login login.php). Di sqlmap diuji dengan menyertakan flag --data="username=admin&password=123".
3. Cara Kerja Prepared Statement
Prepared statement (pernyataan siap pakai) bekerja dalam 2 tahap terpisah di database engine:
- Prepare Stage: Template query SQL dikirim dan dikompilasi oleh server MySQL terlebih dahulu (misal:
SELECT * FROM users WHERE id = ?). Struktur query dikunci. - Execute Stage: Nilai variabel dikirim secara terpisah dan diikat (bound) murni sebagai nilai data literal, tanpa mengubah struktur perintah yang telah dikunci.
4. Cara Membaca Output & Parameter SQLMap
sqlmap adalah alat pengujian penetrasi otomatis yang mendeteksi dan mengeksploitasi kerentanan SQL injection. Berikut adalah penjelasan parameter penting:
| Option / Flag | Fungsi Utama | Contoh Penggunaan |
|---|---|---|
-u <url> |
Menentukan target URL yang akan diaudit. | -u "http://localhost/sqlmap-lab/sqli.php?id=1" |
-p <param> |
Menentukan nama parameter spesifik yang ingin diuji. | -p id atau -p q |
--level=1-5 |
Tingkat ketelitian/kedalaman tes (default: 1). Level tinggi menguji Headers/Cookies. | --level=3 |
--risk=1-3 |
Tingkat risiko payload yang digunakan (default: 1). Risk 3 mencoba payload heavy. | --risk=2 |
--technique |
Fokus ke teknik SQLi spesifik: B (Boolean), E (Error), U (Union), S (Stacked), T (Time). | --technique=BEU |
--text-only |
Hanya membandingkan konten teks HTTP response (mengabaikan HTML tag). | --text-only |
--dbs |
Mengekstrak daftar nama database yang tersedia. | sqlmap -u "..." --dbs |
--tables |
Mengekstrak daftar nama tabel di database target. | sqlmap -u "..." -D sqlmap_lab --tables |
--columns |
Mengekstrak nama kolom dari tabel tertentu. | sqlmap -u "..." -D sqlmap_lab -T users --columns |
--dump |
Mendownload / dump data dari isi tabel database. | sqlmap -u "..." -D sqlmap_lab -T users --dump |
5. Arti Response HTTP 403 & WAF Bypass
Response HTTP 403 Forbidden terjadi saat Web Application Firewall (WAF) atau sistem pengaman web memblokir request karena mendeteksi pola payload mencurigakan (seperti kata kunci UNION, SELECT, atau kutip satu ').
Dalam lingkungan pengujian profesional, penguji menggunakan tamper script atau penyesuaian header HTTP untuk mengevaluasi efektivitas aturan WAF.
6. Cara Memperbaiki SQL Injection
Satu-satunya cara yang paling efektif dan direkomendasikan secara standar industri (OWASP) untuk mencegah SQL Injection adalah dengan menggunakan Prepared Statements dengan Parameterized Queries.
// Selalu gunakan placeholder (?) atau named parameter (:param)
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');
$stmt->execute([
'email' => $user_email,
'status' => 'active'
]);
$user = $stmt->fetch();