Actividad Grupal 1 · Vulnerability Scanning Tools · Calidad y Pruebas de Software (SI-784) · Universidad Privada de Tacna
Autor: Milton H. Flores Chino · Equipo: Milton H. Flores Chino y Manuel Dongo Palza

Abrigando Corazones es una aplicación PHP de una campaña solidaria en Tacna. En la actividad de Calidad y Pruebas de Software, revisamos qué ocurre cuando el enrutador recibe un valor con un tipo distinto del esperado. Usamos Nuclei para convertir ese caso en una prueba repetible y llevarla al workflow del proyecto.

Preparar el entorno de prueba

La última comprobación local se hizo el 14 de noviembre de 2026 con el commit 4dffd5e, PHP 8.4.27 y Nuclei 3.11.1. La copia se ejecutó en 127.0.0.1:8788, con correo y métricas desactivados. La web pública se usó como referencia del proyecto. Las peticiones de prueba se hicieron al servidor local.

Ejecutar el escaneo

La plantilla de Nuclei compara dos peticiones HTTP. Primero verifica que la ruta normal funcione. Después envía el parámetro url como arreglo. La coincidencia exige que ambas respuestas cumplan la condición status_code_1 == 200 && status_code_2 == 500.

Petición en el servidor local Resultado
GET /contacto HTTP 200. Se cargó la página de contacto.
GET /?url%5B%5D=contacto HTTP 500. El parámetro url llegó como arreglo.

Nuclei registró una coincidencia. En el log de PHP apareció un TypeError en la línea 9 de app/core/Router.php. El enrutador pasa el valor de url directamente a trim(), que espera una cadena:

$rawUrl = isset($_GET['url']) ? trim($_GET['url'], '/') : ''; 

Ver la línea del enrutador revisada

Clasificamos el hallazgo como bajo en la plantilla porque la prueba demostró un error de servidor en esa petición, con alcance limitado al caso reproducido.

La corrección propuesta es comprobar el tipo de url antes de normalizarlo y devolver HTTP 400 al recibir un arreglo. La prueba de regresión debe mantener el 200 de la ruta válida y comprobar que desaparece el 500 en la entrada inválida.

Integrar Nuclei al flujo de publicación

El workflow empaqueta el commit, excluye la configuración local y verifica la sintaxis de PHP. Luego levanta la copia del paquete, ejecuta Nuclei y guarda resultados-nuclei.jsonl como artefacto de la ejecución. La preparación y el escaneo se verificaron localmente con 47 archivos PHP validados y un hallazgo reproducido.

La etapa de publicación se activa manualmente desde GitHub Actions. Está configurada para transferir el paquete a InfinityFree por FTP con TLS y comprobar en el servidor un marcador con el commit. La ejecución #2 quedó bloqueada por facturación en GitHub antes de iniciar el trabajo. La web ya estaba disponible en InfinityFree y la subida automatizada queda pendiente.

Conclusión

Lo más útil de la prueba fue poder relacionar una respuesta de la aplicación con una línea de código. La plantilla permite repetir esa comprobación cuando el equipo cambie el enrutador.