Belajar Serangan SQL Injection Serta Langkah Penanganannya

 Apa Itu SQL Injection?

SQL Injection adalah salah satu teknik serangan yang digunakan oleh penyerang untuk mengeksploitasi kerentanan pada aplikasi web yang menggunakan database. Dengan serangan ini, penyerang dapat mengakses data sensitif, melewati mekanisme login, atau bahkan merusak sistem.


Contoh Praktik SQL Injection: Bypass Login

Langkah-Langkahnya:

  1. Persiapan:

    • Siapkan server lokal seperti XAMPP atau Laragon untuk menjalankan aplikasi web.
    • Buat database bernama demo_db dan tabel users dengan skrip berikut:
      (sql)

      CREATE DATABASE demo_db; USE demo_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL ); INSERT INTO users (username, password) VALUES ('admin', 'adminpass'); INSERT INTO users (username, password) VALUES ('user', 'userpass');
  2. Formulir Login Rentan: Buat file login.html dengan formulir login sederhana:

    (html)

    <!DOCTYPE html> <html> <head><title>Login Page</title></head> <body> <h2>Login</h2> <form action="login.php" method="post"> <label>Username:</label> <input type="text" name="username"><br> <label>Password:</label> <input type="password" name="password"><br> <input type="submit" value="Login"> </form> </body> </html>
  3. Skrip Login dengan Kerentanan: Buat file login.php dengan query rentan seperti berikut:

    (php)

    $conn = new mysqli("localhost", "root", "", "demo_db"); if ($conn->connect_error) die("Koneksi gagal: " . $conn->connect_error); $user = $_POST['username']; $pass = $_POST['password']; $sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'"; $result = $conn->query($sql); if ($result->num_rows > 0) echo "Login berhasil!"; else echo "Login gagal!"; $conn->close();
  4. Melakukan Serangan SQL Injection:

    • Inputkan pada form login:
      (bash)

      Username: ' OR '1'='1 Password: ' OR '1'='1
    • Query akan menjadi:
      (sql)

      SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
      Karena 1=1 selalu benar, sistem menganggap login berhasil


Dampak SQL Injection

  • Akses Tidak Sah: Penyerang dapat masuk ke akun tanpa kredensial.
  • Kebocoran Data: Data sensitif seperti nama, alamat, dan password dapat terekspos.
  • Kerusakan Sistem: Penyerang dapat menghapus atau memodifikasi data.

Cara Mengatasi SQL Injection

  1. Gunakan Query Parameterized (Prepared Statements):
    Menggunakan parameter terpisah untuk data input. Contoh:

    php

    $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $user, $pass); $stmt->execute(); $result = $stmt->get_result();
  2. Validasi Input: Pastikan input dari pengguna sudah divalidasi untuk mencegah karakter mencurigakan seperti ' atau ".

  3. Batasi Hak Akses Database: Berikan akses minimal pada user database aplikasi web.

  4. Gunakan Firewall Aplikasi Web (WAF): WAF dapat mendeteksi dan mencegah upaya SQL Injection.

  5. Jika kita memperbaiki skrip login yang rentan tadi akan menjadi:

    <?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "demo_db";

    // Membuat koneksi ke database
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Mengecek koneksi
    if ($conn->connect_error) {
        die("Koneksi gagal: " . $conn->connect_error);
    }

    // Mengambil input dari formulir
    $user = $_POST['username'];
    $pass = $_POST['password'];

    // Query menggunakan prepared statement
    $stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    if (!$stmt) {
        die("Query gagal: " . $conn->error);
    }

    // Bind parameter
    $stmt->bind_param("ss", $user, $pass);

    // Menjalankan query
    $stmt->execute();

    // Mendapatkan hasil
    $result = $stmt->get_result();

    // Memproses hasil
    if ($result->num_rows > 0) {
        echo "Login berhasil!";
    } else {
        echo "Login gagal!";
    }

    // Menutup koneksi
    $stmt->close();
    $conn->close();
    ?>

Kesimpulan:
SQL Injection adalah ancaman nyata bagi keamanan aplikasi web, tetapi dengan langkah pencegahan yang tepat, Anda dapat melindungi sistem Anda dari serangan ini. Selalu gunakan praktik pengkodean yang aman dan tetap waspada terhadap kerentanan dalam aplikasi Anda.

Comments