💉 Lab 04 Menengah

SQL Injection Lab

Pelajari bagaimana hacker menyerang database melalui input yang tidak aman, dan cara mencegahnya!

⚠️
Database belum disiapkan! Jalankan setup.php terlebih dahulu untuk membuat database dan tabel yang diperlukan.

📖 Apa itu SQL Injection?

SQL Injection (SQLi) adalah teknik serangan di mana hacker menyisipkan kode SQL berbahaya melalui input pengguna (form login, search box, dll) untuk memanipulasi database.

Bayangkan website toko online punya form pencarian. Normalnya, kamu ketik "laptop" dan website mencarikan produk laptop. Tapi dengan SQL Injection, hacker bisa menyisipkan perintah SQL untuk melihat seluruh data di database, termasuk data rahasia!

⚠️
Disclaimer: Lab ini hanya untuk tujuan edukasi. Melakukan SQL Injection pada website tanpa izin adalah ILEGAL!

Cara Kerja SQL Injection:

PHP
// Query RENTAN (JANGAN ditiru!)
$sql = "SELECT * FROM users
    WHERE username = '$input'";

// Jika hacker input: ' OR '1'='1
// Query menjadi:
SELECT * FROM users
    WHERE username = '' OR '1'='1'
// '1'='1' selalu TRUE → semua data keluar!
💀
VERSI RENTAN! Form di bawah ini SENGAJA dibuat tidak aman untuk demo. Coba masukkan payload SQL Injection dan lihat apa yang terjadi!

💀 Login Form — RENTAN SQL Injection

Coba login dengan payload SQL Injection! Hint: ' OR 1=1 #

💀 Pencarian Produk — RENTAN SQL Injection

Cari produk di toko! Hint: coba ' OR 1=1 # untuk melihat semua data termasuk yang tersembunyi!

📋 Payload SQL Injection untuk Dicoba:

// 1. Bypass login — PALING MUDAH (masukkan di username)
' OR 1=1 #

// 2. Bypass login (alternatif — PERHATIKAN spasi setelah --)
' OR '1'='1' -- ← harus ada spasi setelah --

// 3. Lihat semua produk (di search)
' OR 1=1 #

// 4. Union-based (lihat tabel lain)
' UNION SELECT 1,username,password,role,email,5 FROM users_vulnerable #

// 💡 Tips: Di MySQL, # dan -- (dash-dash-spasi) adalah komentar.
// Pakai # lebih gampang karena tidak perlu spasi di belakang!
🛡️
VERSI AMAN! Form ini menggunakan Prepared Statements (Parameterized Queries). Coba masukkan payload SQL Injection yang sama — tidak akan berhasil!

🛡️ Login Form — AMAN dari SQL Injection

Coba masukkan payload yang sama: ' OR 1=1 # — kali ini tidak berhasil!

🛡️ Pencarian Produk — AMAN dari SQL Injection

Pencarian yang aman menggunakan prepared statement. Data tersembunyi tidak akan terekspos!

📊 Perbandingan Kode: Rentan vs Aman

💀 Kode RENTAN

PHP - JANGAN DITIRU!
// ❌ RENTAN SQL INJECTION!
$username = $_POST['username'];
$password = $_POST['password'];

// Input langsung dimasukkan ke query
$sql = "SELECT * FROM users
  WHERE username = '$username'
  AND password = '$password'";

$result = $conn->query($sql);
Input user langsung digabungkan ke string SQL tanpa validasi atau escaping!

🛡️ Kode AMAN

PHP - BEST PRACTICE
// ✅ AMAN - Prepared Statement!
$username = $_POST['username'];
$password = $_POST['password'];

// Gunakan placeholder (?)
$stmt = $conn->prepare(
  "SELECT * FROM users
  WHERE username = ?
  AND password = ?");

$stmt->bind_param("ss",
  $username, $password);
$stmt->execute();
Prepared statement memisahkan kode SQL dari data. Input user TIDAK BISA mengubah struktur query!

🔑 Cara Mencegah SQL Injection:

  • Prepared Statements — Selalu gunakan parameterized queries
  • Input Validation — Validasi dan filter semua input dari user
  • Least Privilege — Berikan hak akses database seminimal mungkin
  • ORM — Gunakan Object-Relational Mapping (Eloquent, Doctrine)
  • WAF — Web Application Firewall untuk filter request berbahaya