Detector de vulnerabilidades PHP2Shell

Introduzca una URL propia o que tenga autorización para probar. Revise indicios de PHP, versiones y respuestas de formularios para evaluar la exposición a PHP2Shell y orientar la corrección.

2

Vulnerabilidades del núcleo de PHP

9.2

Puntuación CVSS v4.0 (crítica)

4

Ramas oficiales corregidas de 8.2 a 8.5

Resumen de vulnerabilidades

¿Qué es PHP2Shell y por qué hay que revisarlo cuanto antes?

PHP2Shell engloba dos vulnerabilidades de seguridad de memoria del núcleo de PHP, CVE-2026-109618 y CVE-2026-109619, ambas con CVSS v4.0 de 9.2. Pueden permitir ejecutar código remoto sin autenticación; el impacto depende de la versión, el despliegue y la vía de ataque.

Leer el aviso oficial de PHP

El problema está en PHP, no solo en una aplicación

Revise PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed y otros entornos PHP que atiendan solicitudes web. PHP considera mod_php la configuración de mayor riesgo, con ataques demostrados antes de ejecutar la aplicación. Una página sencilla o un código seguro no descartan la exposición.

Verifique el entorno PHP además del software del sitio

Actualizar WordPress, Drupal, un framework o un complemento no implica actualizar el PHP que utilizan. Revise la versión asignada a cada sitio, los pools FPM, las imágenes de contenedor, los nodos y el PHP integrado en paneles o dispositivos. Las versiones oficiales corregidas se publicaron el 21 de octubre de 2026.

Qué revisa el detector

Revise indicios de PHP, respuestas y estado de los parches

¿Cómo ayudan las siete solicitudes a la revisión?

Comience con un GET de referencia y envíe un formulario URL-encoded y otro multipart para cada uno de los tres métodos. Revise cada respuesta antes de continuar. Estas solicitudes normales comparan comportamientos sin cargas de ejecución de código ni de agotamiento de memoria.

Siete solicitudes HTTP para revisar PHP2Shell
Orden Método Contenido de la solicitud Qué observar
01GETSin cuerpo de solicitudAccesibilidad, redirecciones, versiones PHP públicas y cabeceras de respuesta.
02POSTapplication/x-www-form-urlencodedUn campo de texto normal como control de POST.
03POSTmultipart/form-dataUn campo de texto comparado con el POST de control, sin archivos ni campos de progreso de subida.
04PUTapplication/x-www-form-urlencodedUn campo de texto normal para observar cómo gestiona PUT esta ruta.
05PUTmultipart/form-dataCompare con el PUT URL-encoded para detectar diferencias por tipo de contenido.
06PATCHapplication/x-www-form-urlencodedUn campo de texto normal como control de PATCH.
07PATCHmultipart/form-dataCompare con el PATCH de control, sin deducir el comportamiento de otros métodos solo a partir de POST.

Las referencias a PHP en X-Powered-By o Server y las cookies como PHPSESSID son solo indicios del entorno. Pueden ocultarse, modificarse o personalizarse. Una cookie tampoco demuestra que PHP haya analizado el cuerpo de la solicitud.

Estas comprobaciones solo cubren la URL y ruta indicadas. Otras rutas, reglas CDN y servidores de origen accesibles directamente pueden comportarse de forma distinta. No extrapole el resultado de la portada a todo el sitio. Revise solo rutas autorizadas adecuadas para formularios.

Cómo interpretar los resultados

Distinga los indicios de exposición de las correcciones verificadas

Las respuestas públicas solo aportan parte de las evidencias. Las versiones pueden estar ocultas o modificadas y las antiguas pueden incluir parches retroportados. Verifique el entorno real y no confunda falta de pruebas con seguridad.

Conozca los errores de evaluación habituales

Se observa un indicio de versión corregida

Una versión pública igual o superior al umbral de su rama es un indicio útil, pero un proxy puede modificarla. Confirme en el servidor que todas las instancias hayan cargado el código corregido.

Se observa riesgo por versión antigua

Priorice las versiones inferiores al umbral oficial, comprobando los parches de la distribución o del proveedor LTS. Si se desconoce su estado, márquelo como pendiente de verificación, no como ejecución remota de código confirmada.

Solicitudes rechazadas o respuestas distintas

Un control correcto y un multipart con 4xx pueden reflejar restricciones de tipo de contenido. Dos respuestas 405 quizá solo indiquen que el método no está admitido. El código de estado no distingue un rechazo del CDN, del servidor web o de la aplicación.

Sin indicios de PHP o sin respuesta útil

Versiones ocultas, cachés de proxy, cookies personalizadas, fallos de conexión y tiempos de espera limitan la evaluación. Registre pruebas insuficientes o evaluación no disponible en lugar de un resultado verde de seguridad.

Proceso de comprobación

Empiece con una URL y revise las evidencias

1

Introduzca la URL de destino

Indique la dirección de un sitio propio o autorizado, incluida la ruta que desea comprobar.

2

Revise cada respuesta al completarse

Revise el GET de referencia y compare las respuestas URL-encoded y multipart de POST, PUT y PATCH, una solicitud cada vez.

3

Revise los hallazgos y las medidas correctivas

Interprete los códigos de estado y las versiones, y verifique los parches en el entorno PHP real y los avisos del proveedor.

Verificación en el servidor

¿Cómo confirmar que el sitio ejecuta un PHP corregido?

Las comprobaciones externas aportan indicios, pero los parches deben confirmarse en el servidor, los contenedores o el panel de alojamiento. Registre el entorno, el origen del paquete, la versión corregida y el estado de los procesos tras actualizar.

1. Identifique el PHP que procesa las solicitudes

Compruebe el PHP asignado al sitio, el módulo web o el pool FPM. Inventaríe versiones coexistentes, sitios, contenedores y nodos balanceados. php -v solo muestra la versión CLI actual, no necesariamente la web. No publique una página phpinfo para esta comprobación.

php -v

2. Verifique la versión completa del paquete y el aviso

Consulte el paquete utilizado y compare su versión completa con el aviso de la distribución. El paquete 8.3.6-0ubuntu0.24.04.13 de Ubuntu 24.04 ya incluye la corrección; PHP 8.3.6 por sí solo omite ese dato. Elija el ejemplo apropiado y ajuste el nombre del paquete.

dpkg-query -W php8.3-fpm
rpm -q php-fpm
Ver la lista oficial de paquetes de Ubuntu

3. Instale una versión corregida de la rama adecuada

Use una versión oficial corregida, una posterior de seguridad de la misma rama o un parche retroportado confirmado. Actualice el PHP integrado en paneles, dispositivos y contenedores según su proveedor. PHP 8.1 y anteriores ya no tienen soporte oficial regular: confirme las correcciones LTS o migre. PHP también publicó parches mínimos de código fuente para 7.4, 8.0 y 8.1.

4. Reinicie y verifique cada instancia

Confirme el reinicio de PHP-FPM, Apache u otros procesos y la sustitución de contenedores y nodos. Actualizar archivos en disco no garantiza reemplazar los procesos antiguos. Las solicitudes anómalas, falta de memoria y caídas de procesos ayudan a investigar, pero su ausencia no demuestra que el sistema no estuviera afectado.

Hágalo usted mismo: siete comprobaciones con curl

El script envía un GET y formularios URL-encoded y multipart con POST, PUT y PATCH, uno por uno. Solo usa campos de texto, sin archivos ni campos de progreso de carga. Ejecútelo únicamente en rutas autorizadas adecuadas para formularios de prueba; incluso las solicitudes normales pueden activar acciones.

Bash / curl
#!/usr/bin/env bash
# PHP2Shell HTTP observations: 7 sequential requests, no exploit payload.
set -u

URL="${1:-https://example.com/}"
case "$URL" in
  http://*|https://*) ;;
  *) printf 'ERROR=HTTP(S)_URL_REQUIRED\n' >&2; exit 2 ;;
esac

if ! command -v curl >/dev/null 2>&1 || ! command -v awk >/dev/null 2>&1; then
  printf 'ERROR=CURL_AND_AWK_REQUIRED\n' >&2
  exit 127
fi

probe() {
  printf '\n[%s/7] %s %s\n' "$1" "$2" "$3"
  local method="$2"
  shift 3
  curl -q --globoff --proto '=http,https' --silent --show-error \
    --connect-timeout 5 --max-time 15 --request "$method" \
    --dump-header - --output /dev/null \
    --write-out '\nHTTP_CODE=%{http_code} TOTAL_SECONDS=%{time_total}\n' \
    "$@" --url "$URL" |
  awk '{
    sub(/\r$/, "")
    line = tolower($0)
    if ($0 ~ /^HTTP\// || line ~ /^(server|x-powered-by|content-type):/ || $0 ~ /^HTTP_CODE=/) {
      print
    } else if (line ~ /^set-cookie:[ \t]*phpsessid[ \t]*=/) {
      print "PHPSESSID=present; value hidden"
    }
  }'
  local curl_status="${PIPESTATUS[0]}"
  if [ "$curl_status" -ne 0 ]; then
    printf 'CURL_EXIT=%s\n' "$curl_status"
    FAILED=1
  fi
}

FAILED=0
probe 1 GET baseline
probe 2 POST urlencoded --data-raw 'php2shell_check=1'
probe 3 POST multipart --form-string 'php2shell_check=1'
probe 4 PUT urlencoded --data-raw 'php2shell_check=1'
probe 5 PUT multipart --form-string 'php2shell_check=1'
probe 6 PATCH urlencoded --data-raw 'php2shell_check=1'
probe 7 PATCH multipart --form-string 'php2shell_check=1'
exit "$FAILED"

Use Bash en Linux/macOS, o WSL o Git Bash en Windows. Guárdelo como php2shell-self-check.sh y ejecute el comando siguiente con una URL de prueba autorizada. No pegue el script Bash directamente en PowerShell.

bash php2shell-self-check.sh https://example.com/test.php

La conexión tiene un límite de 5 segundos y cada solicitud de 15 segundos. El script ignora la configuración personal de curl, verifica TLS y no sigue redirecciones ni reintenta. Ante un 3xx, confirme que la URL final esté autorizada antes de repetir allí. PHPSESSID solo se indica como presente, sin valores de cookies ni cuerpos de respuesta.

HTTP_CODE indica el estado de respuesta y TOTAL_SECONDS el tiempo total. CURL_EXIT distinto de cero señala un fallo de transferencia; las demás comprobaciones continúan. Una salida no nula indica un problema de entrada, dependencias o transferencia. Los HTTP 4xx/5xx se registran normalmente; el código de salida no evalúa vulnerabilidades ni parches.

Cómo interpretar la salida del terminal

Las cabeceras de versión son indicios

Server o X-Powered-By pueden estar ocultos o desactualizados. Verifique el PHP que sirve realmente el sitio: las versiones oficiales mínimas corregidas de cada rama son 8.2.35, 8.3.36, 8.4.27 y 8.5.12. Confirme los parches retroportados del proveedor con la versión completa del paquete y su aviso de seguridad.

Compare ambas codificaciones para el mismo método

Si para el mismo método urlencoded devuelve 2xx o 3xx y multipart devuelve 403 o 406, solo existe una diferencia observable entre respuestas. No confirma un bloqueo del WAF ni un rechazo antes de llegar a PHP.

Una respuesta correcta no demuestra el análisis por PHP

Un 2xx o 3xx para multipart solo indica que se recibió una respuesta de éxito o redirección. No demuestra que el cuerpo llegara a PHP y fuera analizado, ni determina si existe la vulnerabilidad.

Un 405 y los indicadores PHP no bastan por sí solos

Que todo devuelva 405 no demuestra una corrección. La falta de indicadores PHP no prueba que no se use PHP. Una cookie PHPSESSID tampoco determina si se analizó multipart ni qué capa produjo la respuesta.

Ver versiones oficiales corregidas y recomendaciones de actualización
¿Qué aportan las mitigaciones temporales mientras se actualiza?

PHP indica que solo la actualización corrige el problema por completo. Los siguientes ajustes reducen la exposición a vías conocidas, pero no hacen seguro un entorno sin parches. Evalúe los requisitos de la aplicación y las recomendaciones oficiales antes de cambiarlos.

  • Desactive session.upload_progress.enabled y reinicie todos los procesos. Aplíquelo antes de analizar solicitudes mediante php.ini, el pool FPM o la configuración del servidor, no con ini_set() ni .user.ini de FPM. Solo bloquea las vías de sesión confirmadas.
  • Para PHP 8.5, la guía oficial contempla desactivar fatal_error_backtraces y reiniciar los procesos. Esto solo cubre la vía confirmada de trazas de errores fatales, no otras variantes.
  • Revise los límites de tamaño, campos y partes multipart en el servidor web o proxy, y si el origen es accesible sin pasar por el CDN. Ocultar errores, bloquear un método o revisar una sola ruta no sustituye la corrección.

Versiones oficiales corregidas

Compruebe los umbrales corregidos de PHP 8.2–8.5

Compare dentro de cada rama: el umbral de 8.3 no determina el estado de 8.4. No suponga que las versiones preliminares o ramas desconocidas estén corregidas. Verifique los backports y compilaciones propias con la versión completa del paquete, los registros de compilación y los avisos del proveedor.

Leer las recomendaciones oficiales de actualización

¿Usa BaoTa Panel? Actualice PHP desde la tienda de software

Según el anuncio de BaoTa del 2026-10-21, el panel ya ofrece algunas versiones de seguridad de PHP. Consulte la tienda de software de su panel para ver qué versiones están disponibles.

Leer el anuncio de actualización de BaoTa

Antes de actualizar, haga una copia de seguridad del sitio, las bases de datos y la configuración, y elija un horario de mantenimiento adecuado.

  1. Localice el PHP que utiliza su sitio

    Inicie sesión en BaoTa Panel, abra Tienda de software → Instalado, localice la versión de PHP que utiliza su sitio y abra su página de administración.

  2. Instale la versión de seguridad de esa rama

    Busque actualizaciones en la página de administración de PHP y siga las indicaciones para instalar la versión corregida de su rama indicada arriba o una versión de seguridad posterior de esa misma rama.

  3. Reinicie PHP y verifique su sitio

    Tras actualizar, reinicie el servicio PHP correspondiente y confirme que todos los procesos se han recargado. Verifique la versión que sirve al sitio y pruebe el acceso, las subidas, las conexiones a bases de datos y otras funciones.

Si tiene varias versiones de PHP instaladas, revise todas las que sigan en uso. Si instala otra versión, confirme también que el sitio se haya cambiado al entorno PHP corregido.

Preguntas frecuentes

Preguntas sobre detección y corrección de PHP2Shell

Distinga los indicios de versión, los códigos de estado y los parches retroportados para no sobreinterpretar los resultados.

¿Qué es PHP2Shell y qué sitios deben revisarse?

PHP2Shell designa dos vulnerabilidades del núcleo de PHP, CVE-2026-109618 y CVE-2026-109619, que pueden permitir ejecutar código remoto sin autenticación. Revise todos los entornos PHP sin corregir que atiendan solicitudes web, aunque el código de la aplicación sea seguro.

¿Una respuesta 403, 405 o 413 demuestra protección?

No. La autenticación, métodos no admitidos, límites de tamaño o proxies pueden generar esos códigos. Rechazar multipart solo describe el comportamiento de esa ruta; no demuestra que PHP esté corregido ni que todas las vías de ataque estén bloqueadas.

¿La ausencia de cabeceras PHP significa que el sitio no está afectado?

No necesariamente. La versión puede estar oculta y un CDN, proxy inverso o portada estática puede ocultar el backend. La ausencia de indicios significa información insuficiente: compruebe el entorno real del servidor.

¿Qué versiones están corregidas y las antiguas siempre están sin parche?

Las correcciones oficiales están en PHP 8.2.35, 8.3.36, 8.4.27 y 8.5.12. Use una versión corregida o posterior de seguridad en su rama. Las antiguas pueden incluir backports: verifique la versión completa del paquete y el aviso del proveedor. PHP 8.1 y anteriores no tienen soporte oficial regular. Reinicie los procesos tras actualizar.

¿Por qué revisar PUT y PATCH además de POST?

Los métodos pueden seguir rutas y filtros distintos. Desde PHP 8.4, las aplicaciones pueden usar request_parse_body() para analizar multipart en métodos distintos de POST. No significa que todas analicen PUT o PATCH automáticamente. El comportamiento de POST no demuestra protección para otros métodos o rutas.

¿Cómo interpretar POST 200, PUT/PATCH 405 y ningún indicio de PHP?

Registre el entorno PHP y los parches como no confirmados. POST 200 solo indica respuesta; 405, rechazo del método en alguna capa. Páginas estáticas, otros entornos y PHP oculto pueden producir este patrón. Verifique el entorno en el servidor sin declarar seguridad ni vulnerabilidad confirmada.

Las referencias de vulnerabilidades y correcciones se revisaron el 2026-10-22. La observación externa tiene límites; siga los avisos vigentes de PHP y del proveedor para actuar.

Comprenda mejor su exposición a PHP2Shell

Revise las respuestas públicas una a una, interprete las evidencias y verifique los parches en el entorno real del servidor.

Conozca las comprobaciones