Ir al contenido

PHP File Upload

ID de alerta: php_upload MITRE ATT&CK: T1505.003 – Server Software Component: Web Shell


!!! danger “Crítica” Cualquier archivo PHP detectado dentro del directorio uploads se considera una amenaza grave.


  • Web shells: permiten la ejecución remota de comandos en el servidor.
  • Backdoors: otorgan acceso persistente al atacante.
  • Cryptominers: uso no autorizado de los recursos del servidor.
  • Spam mailers: convierten el sitio en una plataforma de envío masivo de spam.
  • Exfiltración de datos: robo de información sensible.

!!! warning "" El directorio uploads no debe contener código ejecutable bajo ninguna circunstancia.


  • Detección inmediata de extensiones sospechosas: .php, .php3, .php4, .php5, .phtml, .phar.
  • Otras extensiones monitorizadas:
    • Scripts: .asp, .aspx, .jsp, .cgi, .pl, .py, .rb.
    • Ejecutables: .exe, .dll, .bat, .sh, .ps1.
  • Análisis de contenido: búsqueda de indicadores PHP (<?php, <?=).
  • Ventana de deduplicación: 30 segundos.

TipoPatrónDescripción
file_patterneval($_POST['cmd']);Ejecución de código remoto
file_patternsystem($_GET['command']);Ejecución de comandos del sistema
file_patternbase64_decode(Código ofuscado
file_patternfile_get_contents('php://input')Lectura directa desde entrada PHP
file_patternc99.php, r57.php, wso.phpWebshells conocidos

  • Plugins legítimos mal diseñados que permiten subir archivos PHP.
  • Desarrolladores subiendo código de prueba (mala práctica).
  • Herramientas de migración o backup que no usan directorios temporales.

!!! warning “Atención” Incluso los “falsos positivos” representan fallos de seguridad graves que deben corregirse.


  1. No ejecutar el archivo. Examinarlo con:

    Ventana de terminal
    strings /path/to/file.php | grep -E 'eval|exec|system|base64'
  2. Calcular hash MD5 y SHA256 del archivo.

  3. Verificar su origen mediante timestamp y logs de acceso (usuario/IP).

  4. Buscar otros shells:

    Ventana de terminal
    find wp-content/uploads -name "*.php" -type f
  5. Revisar logs para detectar requests dirigidas al archivo sospechoso.


=== “Inmediatas”

!!! danger ""
- Aislar el archivo (no eliminar, conservar como evidencia).
- Moverlo a un directorio de cuarentena fuera del `webroot`.
- Bloquear acceso vía `.htaccess`.
- Escanear el sitio completo con herramientas antimalware.
- Cambiar todas las contraseñas (WordPress, hosting, FTP, DB).

=== “Preventivas”

!!! tip ""
Añadir en `.htaccess` dentro de `wp-content/uploads`:
```apache
<FilesMatch "\.(?:php|phtml)$">
Deny from all
</FilesMatch>
```
- Restringir políticas de subida (solo imágenes y documentos).
- Validar archivos del lado servidor antes de guardarlos.
- Implementar `mod_security` con reglas para detección de webshells.
- Asignar permisos seguros (`uploads`: 755 para carpetas, 644 para archivos).