SQL Injection adalah salah satu celah keamanan paling berbahaya yang sering ditemukan di aplikasi web. Dengan teknik ini, peretas dapat memanipulasi query SQL yang dijalankan oleh aplikasi, sehingga bisa membaca, mengubah, bahkan menghapus data penting di dalam database.
Artikel ini akan membahas berbagai jenis SQL , termasuk celah yang sering muncul di CMS lama seperti Lokomedia, serangan berbasis GET maupun POST, teknik eksploitasi umum, hingga cara patch bug SQL agar aplikasi lebih aman.
Apa Itu SQL Injection?
SQL Injection (SQLi) adalah teknik serangan di mana input pengguna disisipkan ke dalam perintah SQL tanpa validasi yang baik. Hal ini membuat query bisa dimanipulasi agar mengembalikan data yang tidak semestinya, melewati autentikasi, atau menjalankan perintah berbahaya.
Menurut OWASP, SQLi termasuk dalam kategori Top 10 Web Application Security Risks karena dampaknya yang besar dan kemudahannya dieksploitasi.
Jenis-Jenis SQL Injection
1. SQL Injection Umum (GET Parameter)
Celah klasik biasanya muncul di URL. Contoh kode rawan:
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$id'";
Payload:
?id=1' OR '1'='1
Hasil: query menampilkan semua data user.
2. SQL pada Metode POST
Form login sering menjadi target. Contoh kode:
$username = $_POST['user'];
$password = $_POST['pass'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
Payload:
user=admin' --
pass=isiapaaja
Password diabaikan, attacker bisa login sebagai admin.
3. SQL Injection pada CMS Lokomedia
CMS Lokomedia (versi lama) sering dieksploitasi karena query langsung menggunakan input user:
$artikel = $_GET['id'];
$hasil = mysql_query("SELECT * FROM artikel WHERE id_artikel='$artikel'");
URL rawan:
http://target.com/?module=artikel&id=1'
4. Blind SQL I
Jika aplikasi tidak memunculkan error, attacker bisa menguji dengan delay:
?id=1 AND SLEEP(5)
Jika halaman melambat, berarti query benar-benar dijalankan.
5. Union-based SQL I
Teknik untuk menampilkan data tabel lain. Contoh:
?id=1 UNION SELECT username, password FROM users
Jika kolom cocok, hasil query akan menampilkan daftar user.
Contoh Payload SQL
Beberapa contoh payload yang sering dipakai pentester:
' OR '1'='1admin' --' UNION SELECT null, version(), database() --1 AND SLEEP(5)' OR EXISTS(SELECT * FROM users WHERE username='admin') --
Dampak SQL Injection
- Kebocoran Data Sensitif (username, email, password hash).
- Bypass Login → masuk ke admin panel tanpa password.
- Eksekusi Perintah Berbahaya → misalnya
xp_cmdshellpada MSSQL. - Penghapusan Data → query
DROP TABLE users. - Penguasaan penuh server bila digabung dengan RCE.
Cara Patch Bug SQL Injection
1. Gunakan Prepared Statement
Contoh dengan mysqli:
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
2. Gunakan ORM atau Query Builder
Framework modern sudah punya proteksi bawaan. Contoh Laravel:
$user = DB::table('users')->where('username', $username)->first();
3. Validasi dan Escape Input
- Gunakan
filter_input()atauctype_digit()untuk angka. - Jangan hanya mengandalkan
addslashes()ataumysql_real_escape_string().
4. Batasi Hak Akses Database
- Jangan gunakan user DB dengan hak root.
- Buat user khusus dengan hak SELECT, INSERT, UPDATE saja.
5. Gunakan WAF (Web Application Firewall)
WAF seperti ModSecurity atau Cloudflare WAF bisa menyaring payload SQLi.
Referensi: PortSwigger SQLi Cheat Sheet.
6. Update CMS dan Framework
CMS lama (Lokomedia, Joomla lawas, WordPress versi lama) banyak memiliki celah. Update ke versi terbaru agar aman.
7. Monitoring & Logging
- Catat query mencurigakan.
- Gunakan IDS/IPS untuk mendeteksi serangan.
- Buat alert untuk pola query aneh (misalnya ada
UNION,SLEEP).
Studi Kasus: Patch SQL Injection di Lokomedia
Kode rawan:
$id = $_GET['id'];
$sql = mysql_query("SELECT * FROM artikel WHERE id_artikel='$id'");
Versi aman:
$id = (int) $_GET['id'];
$stmt = $conn->prepare("SELECT * FROM artikel WHERE id_artikel=?");
$stmt->bind_param("i", $id);
$stmt->execute();
Dengan cara ini, input selalu dianggap data, bukan perintah SQL.
Tips Praktis untuk Developer
- Selalu gunakan parameterized query.
- Hindari query dinamis yang langsung menempelkan input user.
- Audit kode lama sebelum aplikasi diluncurkan.
- Gunakan internal tools seperti penetration testing untuk uji coba.
- Baca panduan keamanan IT lain, misalnya artikel kami:
Ilustrasi SQL Injection


Kesimpulan
SQL Injection adalah ancaman nyata bagi keamanan web. Serangan ini tidak hanya bisa mencuri data, tetapi juga menghancurkan sistem. Namun, dengan disiplin menerapkan prepared statement, validasi input, pembaruan CMS/framework, serta tambahan perlindungan seperti WAF, serangan SQLi dapat dicegah.
Sebagai developer maupun pemilik website, pastikan selalu melakukan update, monitoring, dan audit keamanan agar aplikasi tetap terlindungi dari celah berbahaya ini.
