SQL Injection

From DefacerID Encyclopedia
Revision as of 00:08, 9 August 2024 by DefacerID (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
SQL Injection (Resource: https://blogs.zeiss.com/digital-innovation/en/lets-talk-about-security-sql-injection/)

SQL Injection (SQLi) adalah salah satu kerentanan keamanan yang paling umum dalam aplikasi web. Kerentanan ini memungkinkan penyerang untuk menyuntikkan perintah SQL berbahaya ke dalam query database, yang dapat mengakibatkan akses tidak sah ke data sensitif, kerusakan data, atau bahkan kontrol penuh atas sistem.

Sejarah

SQL Injection pertama kali dikenal luas pada akhir 1990-an dan awal 2000-an. Meskipun teknik ini sudah ada sejak lama, banyak aplikasi web yang masih rentan terhadap serangan SQLi karena kurangnya pemahaman atau penerapan praktik pengkodean yang aman. Penelitian dan publikasi oleh peneliti keamanan dan organisasi keamanan siber telah membantu meningkatkan kesadaran tentang kerentanan ini.

Cara Kerja SQL Injection

SQL Injection terjadi ketika input pengguna tidak divalidasi dengan benar dan langsung dimasukkan ke dalam query SQL. Penyerang dapat memanipulasi input ini untuk menyisipkan perintah SQL tambahan yang dapat dieksekusi oleh database. Kerentanan ini biasanya disebabkan oleh kurangnya sanitasi dan parameterisasi input.

Jenis-Jenis SQL Injection

In-band SQL Injection (Classic)

Jenis SQLi ini memungkinkan penyerang untuk langsung mendapatkan hasil dari query yang dimodifikasi melalui saluran yang sama dengan permintaan awal. Contoh: Penyerang dapat melihat hasil langsung dari query yang disuntikkan.

Inferential SQL Injection (Blind)

Dalam jenis ini, penyerang tidak mendapatkan hasil langsung dari query yang dimodifikasi, tetapi dapat menyimpulkan informasi berdasarkan respons aplikasi atau perubahan yang terlihat. Ini biasanya terjadi jika aplikasi tidak memberikan hasil query secara langsung.

Out-of-band SQL Injection

Penyerang menggunakan saluran komunikasi terpisah untuk mendapatkan hasil dari query yang dimodifikasi. Misalnya, penyerang mungkin memanfaatkan fitur seperti email atau DNS untuk mengirim data hasil query ke server yang dikendalikan penyerang.

Contoh SQL Injection

Contoh HTTP Request (POST/GET POC)

GET Request:

GET /login.php?username=admin' OR '1'='1'--&password=anything HTTP/1.1

Host: example.com

POST Request:

POST /login.php HTTP/1.1

Host: example.com

Content-Type: application/x-www-form-urlencoded

username=admin' OR '1'='1'--&password=anything

Pada contoh di atas, penyerang menyisipkan perintah SQL ' OR '1'='1'-- ke dalam parameter username. Ini dapat menyebabkan query SQL menjadi selalu benar, sehingga memungkinkan penyerang untuk login tanpa kredensial yang valid.

Dampak Kerentanan

Dampak dari SQL Injection dapat sangat merugikan, termasuk:

  • Pencurian Data: Penyerang dapat mengakses data sensitif, termasuk informasi pribadi dan data keuangan.
  • Pengubahan Data: Penyerang dapat mengubah atau menghapus data yang ada di database.
  • Eksekusi Perintah Sistem: Dalam beberapa kasus, penyerang dapat menjalankan perintah sistem di server database.
  • Kompromi Sistem: Penyerang dapat mendapatkan kontrol penuh atas server yang menjalankan database, yang dapat mengakibatkan kompromi sistem lebih lanjut.

Cara Mencegah SQL Injection

PHP

Menggunakan Prepared Statements dengan MySQLi

$mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ? AND password = ?");

$stmt->bind_param("ss", $username, $password);

$username = $_POST['username'];

$password = $_POST['password'];

$stmt->execute();

$result = $stmt->get_result();

Java

Menggunakan Prepared Statements dengan JDBC

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/database", "user", "password");

String query = "SELECT * FROM users WHERE username = ? AND password = ?";

PreparedStatement pstmt = con.prepareStatement(query);

pstmt.setString(1, username);

pstmt.setString(2, password);

ResultSet rs = pstmt.executeQuery();

Python

Menggunakan Prepared Statements dengan SQLite

import sqlite3

conn = sqlite3.connect('database.db')

c = conn.cursor()

query = "SELECT * FROM users WHERE username = ? AND password = ?"

c.execute(query, (username, password))

results = c.fetchall()


Untuk mencegah SQL Injection, selalu gunakan query yang diparameterisasi atau prepared statements, validasi dan sanitasi semua input pengguna, dan hindari penggunaan query SQL dinamis yang membangun string SQL langsung dari input pengguna.