Logo de Reconocimiento
Reconocimiento Pasivo — Análisis de Seguridad

Campus Virtual PUCMM

campusvirtual.pucmm.edu.do · Tres niveles de acceso · Dos revisiones

"Lo que el navegador revela, el analista documenta"

Autor Steven Capellán (Kroko)
Programa TEP Ciberseguridad
Fecha Abril – Mayo 2026
Tipo Pasivo · Solo HTML público
Índice
I

Resumen Ejecutivo

24 hallazgos documentados en tres revisiones y cuatro herramientas externas.
Los hallazgos más críticos permanecen sin corregir.
Reconocimiento pasivo + validación con Security Headers, Mozilla Observatory, SSL Labs, W3C Validator y WAVE
4
Crítico
7
Alto
7
Medio
2
Bajo/Info
4
Corregidos
24
Total
Hallazgo más grave
Sin Content Security Policy — expone a ataques XSS sin barrera alguna
Método de análisis
Reconocimiento pasivo — solo código fuente público (Ctrl+U)
Corregidos entre revisiones
4 hallazgos fueron atendidos: font deprecado, placeholder, Vvveb, Google Fonts
II

Comparativa — Cuatro Revisiones

# Sev. Hallazgo 1ª Rev. 2ª Rev. 30/Abr/2026 3ª Rev. 02/May/2026 4ª Rev. (curl) 08/May/2026
01 Crítico Sin Content Security Policy (CSP) Ausente Sin cambios Sin cambios Confirmado vía curl
02 Crítico Sin X-Frame-Options Ausente Corregido Corregido Confirmado: sameorigin
03 Crítico Cookie MoodleSession sin HttpOnly Detectado Sin cambios Sin cambios Confirmado vía curl
04 Crítico TLS 1.0 y 1.1 activos (obsoletos) Detectado Sin cambios Sin cambios Sin cambios
05 Alto sesskey expuesto sin sesión Presente Sin cambios Sin cambios Sin cambios
06 Alto Stack tecnológico expuesto Presente Sin cambios Sin cambios Confirmado: Apache/2.4.62 + PHP/8.2.30
07 Alto Rutas internas del servidor Presente Sin cambios Sin cambios Sin cambios
08 Alto IDs de cursos enumerables Nuevo Presente Sin cambios Sin cambios
09 Alto PDFs institucionales sin auth Nuevo Presente Sin cambios Sin cambios
10 Alto IDs de usuarios en línea expuestos Nuevo Presente Sin cambios Sin cambios
11 Alto Sin TLS 1.3 Detectado Sin cambios Sin cambios Sin cambios
12 Medio Sin HSTS (Strict-Transport-Security) Detectado Sin cambios Sin cambios Confirmado vía curl
13 Medio Mixed Content HTTP en HTTPS Presente Sin cambios Sin cambios Sin cambios
14 Medio safeexambrowser.org via HTTP Nuevo Presente Sin cambios Sin cambios
15 Medio PHP/Apache expuesto en headers Detectado Sin cambios Sin cambios Confirmado vía curl
16 Medio IDs duplicados en HTML (5 casos) Detectado Sin cambios Sin cambios Corregido
17 Medio Vvveb page builder activo Presente Corregido Corregido Confirmado: solo atributo deshabilitado
18 Medio Texto placeholder sin reemplazar Presente Solo auth Sigue público Sigue en sección cerrada
19 Medio Google Fonts cargado 4 veces Corregido Corregido Regresión: 10× cerrada / 8× abierta
20 Bajo HTML sin minificar 9,771 3,595 Sin cambio Sin cambio
21 Bajo Estilos CSS inline excesivos 171 321 auth 315 auth Corregido (0 inline)
22 Info Tag <font> deprecado (1997) Presente Solo público Sigue público Corregido (0 ocurrencias)
23 Info Imágenes sin atributo alt 8 imgs 9 imgs Sin cambios Corregido (0 imgs sin alt)
24 Info 38 errores de contraste (WAVE) Detectado Sin cambios Sin cambios Sin cambios
25 Medio Sin X-Content-Type-Options Detectado vía curl
26 Medio Sin Referrer-Policy Detectado vía curl
27 Bajo Sin Permissions-Policy Detectado vía curl
III

Detalle de Hallazgos

#01 Ausencia de Content Security Policy (CSP) Crítico
No se encontró ninguna cabecera CSP en ninguno de los tres niveles analizados. Es la primera línea de defensa contra XSS. Sin ella, cualquier script inyectado se ejecuta sin restricciones en el navegador de la víctima — permitiendo robo de cookies, captura de credenciales y redirección silenciosa.
Búsqueda en 3 HTMLs: 0 ocurrencias de "content-security-policy"
Dónde está el problema
Configuración del servidor web (Apache/Nginx)
No es un error de código HTML — es una cabecera HTTP que nunca fue configurada
Cómo se corrige
Agregar en el servidor:
Header set Content-Security-Policy
"default-src 'self'; script-src 'self';
style-src 'self' fonts.googleapis.com;"
Seguridad CabecerasXSSSin corregir
#02 Ausencia de X-Frame-Options (Anti-Clickjacking) Crítico
Sin protección contra Clickjacking en ningún nivel. Un atacante puede embeber el campus dentro de un iframe malicioso con elementos invisibles superpuestos sobre el formulario de login, engañando a los usuarios para que entreguen sus credenciales sin saberlo.
0 ocurrencias de "x-frame-options" o "frame-ancestors" en los 3 HTML
Dónde está el problema
Configuración del servidor web (Apache/Nginx)
Cabecera HTTP ausente — una sola línea en la configuración del servidor lo resuelve
Cómo se corrige
Agregar en el servidor:
Header always set X-Frame-Options "SAMEORIGIN"

O via CSP:
frame-ancestors 'self';
Seguridad CabecerasClickjackingSin corregir
#03 Session Key expuesto sin sesión activa Alto
Un sesskey activo aparece en la página de login sin usuario autenticado. Un token de sesión no debería existir para visitantes anónimos. Además, el sessiontimeout (14,400 segundos = 4 horas) está expuesto, revelando exactamente cuánto tiempo tiene un atacante para usar un token robado.
"sesskey":"zhkOH2s6Sp", "sessiontimeout":"14400" visible en M.cfg público
Dónde está el problema
Línea ~14 del HTML (M.cfg global de Moodle)
Moodle inyecta configuración JS para todos los visitantes, incluyendo tokens de sesión anónimos
Cómo se corrige
En config.php de Moodle:
Revisar $CFG->sessiontimeout y lógica de generación de sesskeys para usuarios guest/anónimos
Gestión de SesionesInformation DisclosureSin corregir
#04 Stack tecnológico completamente expuesto Alto
Las versiones exactas de todas las tecnologías son visibles públicamente, permitiendo búsqueda directa de CVEs conocidos para cada versión sin acceso al sistema.
jQuery 3.7.1 · jQuery UI 1.14.1 · YUI 3.18.1 · RequireJS 3.2.2 · RemUI/Edwiser
Dónde está el problema
Scripts <script src="..."> y M.cfg en el HTML
Las versiones están en las URLs de los archivos JS y en la configuración global de Moodle/YUI
Cómo se corrige
Minificar y ofuscar JS en producción
Eliminar números de versión de las URLs públicas
Mantener librerías actualizadas a últimas versiones
Information DisclosureSin corregir
#05 Rutas internas del servidor visibles Alto
Múltiples rutas internas, incluyendo la ruta al panel de administración, son visibles en el código fuente público sin requerir autenticación.
/moodle/admin/tool/dataprivacy/summary.php · /moodle/admin/tool/lp/coursecompetencies.php?courseid=114944 · +13 rutas
Dónde está el problema
Links y atributos href/action en el HTML
Moodle genera estas rutas dinámicamente en el HTML para su navegación interna — están en el DOM visible
Cómo se corrige
Minificar HTML en producción
Agregar en .htaccess:
Restrict access to /admin/ by IP
Require ip 192.168.x.x
Information DisclosureSin corregir
#06 IDs de cursos enumerables Nuevo Alto
En el área de clase se exponen IDs secuenciales de todas las categorías de cursos de la universidad. Un atacante puede enumerar sistemáticamente el catálogo académico completo sin autenticación.
categoryid=1, 10, 100, 101, 102... hasta 111+ visible públicamente en el HTML
Dónde está el problema
Atributos data- y parámetros en URLs del HTML del aula
Moodle expone los IDs numéricos secuenciales de categorías en el menú de navegación del curso
Cómo se corrige
Usar UUIDs no predecibles en lugar de IDs secuenciales
Implementar control de acceso en endpoints de categorías para usuarios no autenticados
Information DisclosureEnumeraciónNuevo hallazgo
#07 PDFs institucionales sin autenticación Nuevo Alto
Documentos internos de la institución son accesibles directamente via URL sin ningún tipo de autenticación. Si contienen información sensible sobre configuración interna o procesos, representan un vector de reconocimiento.
campusvirtual.pucmm.edu.do/FAQPVA.pdf · /GuiaPVADocentes.pdf · /GuiaPVAEstudiantes.pdf
Dónde está el problema
Links href en el HTML del aula virtual
Los archivos están servidos directamente desde la raíz del servidor sin ningún control de autenticación
Cómo se corrige
Mover PDFs a /moodle/pluginfile.php (sistema de archivos de Moodle con autenticación)
O agregar en .htaccess:
Require valid-user para la carpeta /docs/
Control de AccesoNuevo hallazgo
#08 Mixed Content — HTTP dentro de HTTPS Medio
Los enlaces a redes sociales institucionales usan HTTP inseguro dentro de una página HTTPS. Esto puede habilitar ataques Man-in-the-Middle en esos recursos específicos. Los navegadores modernos lanzan advertencias de seguridad por este tipo de contenido mixto.
http://www.facebook.com/pucmm/ · http://twitter.com/pucmm · http://www.instagram.com/pucmm · http://www.youtube.com/pucmmtv/
Dónde está el problema
Atributos href en el footer del HTML (presentes en los 3 niveles)
Los links de redes sociales institucionales están hardcodeados con http:// en la plantilla del tema
Cómo se corrige
Editar la plantilla del tema RemUI/Edwiser
Reemplazar http:// por https:// en cada enlace
O agregar en CSP: upgrade-insecure-requests;
Seguridad TransporteMITMSin corregir
#09 safeexambrowser.org referenciado via HTTP Nuevo Medio
El enlace de descarga del Safe Exam Browser, software utilizado para exámenes en línea, se referencia via HTTP inseguro. Dado que los estudiantes pueden descargar software desde este enlace, un ataque MITM podría interceptar y modificar la descarga.
http://safeexambrowser.org/download_en.html — presente en los 3 niveles de acceso
Dónde está el problema
Link href en el HTML del área de exámenes (presentes en los 3 niveles)
El enlace de descarga del SEB está hardcodeado con HTTP en la configuración del plugin de exámenes
Cómo se corrige
Editar configuración del plugin de Safe Exam Browser en Moodle
Cambiar el link a https://safeexambrowser.org/download_en.html
Seguridad TransporteSupply ChainNuevo hallazgo
#10 Vvveb page builder activo en producción Corregido
El editor de páginas Vvveb se encontraba activo en producción revelando la estructura interna del editor. Fue eliminado en la segunda revisión.
ConfiguraciónCorregido
#11 Texto placeholder sin reemplazar Corregido
Texto de plantilla activo en producción: "Start Editing your content with our live customizer." Indicaba despliegue sin revisión. Corregido en la segunda revisión.
ConfiguraciónCorregido
#12 Google Fonts cargado 4 veces Corregido
La misma fuente era solicitada 4 veces redundantemente, impactando rendimiento y exponiendo la IP de cada visitante a Google 4 veces por carga. Corregido en la segunda revisión.
PrivacidadRendimientoCorregido
#13 HTML sin minificar Parcial
9,771 líneas de HTML perfectamente legible en la primera revisión (con sesión). En la segunda revisión la página sin sesión redujo a 3,595 líneas, pero las páginas autenticadas siguen siendo extensas y sin ofuscación.
1ª revisión: 9,771 líneas · 2ª revisión: 3,595 (cerrada) / 9,587 (abierta)
Dónde está el problema
Proceso de build/despliegue del servidor
El HTML se sirve directamente sin pasar por ningún proceso de minificación o compresión
Cómo se corrige
Implementar minificación en el proceso de deploy
Habilitar compresión Gzip/Brotli en el servidor:
AddOutputFilterByType DEFLATE text/html
Buenas PrácticasParcialmente corregido
#14 171 estilos CSS inline Parcial
171 atributos style= directamente en elementos HTML en la primera revisión. La segunda revisión redujo a 50 en la página sin sesión, pero la superficie sigue siendo significativa e interfiere con una futura implementación de CSP.
Dónde está el problema
Directamente en etiquetas HTML del código fuente
La plantilla RemUI/Edwiser y el page builder generaron estilos inline que nunca fueron migrados a CSS
Cómo se corrige
Migrar todos los style="..." a clases en archivos .css externos
Necesario también para poder implementar CSP sin usar 'unsafe-inline'
Calidad de CódigoParcialmente corregido
#15 Tag <font> deprecado desde 1997 Corregido
Uso del tag HTML <font> oficialmente deprecado desde HTML 4.01 (1999) y removido en HTML5. Corregido en la segunda revisión.
Calidad de CódigoCorregido
#16 8 imágenes sin atributo alt Info
8 imágenes incluyendo el logo institucional sin atributo alt. Los lectores de pantalla no pueden describir estas imágenes a usuarios con discapacidad visual, violando WCAG 2.1.
Dónde está el problema
Etiquetas <img> en el HTML — header, footer y cuerpo de la página
Las imágenes fueron insertadas sin el atributo alt en la plantilla del tema
Cómo se corrige
Editar plantilla del tema RemUI:
<img src="logo.png" alt="Logo PUCMM">
Para imágenes decorativas: alt=""
AccesibilidadWCAG 2.1Sin corregir
#17 IDs de usuarios en línea expuestos Alto
Los IDs numéricos de usuarios activos en el campus son visibles en el HTML del aula sin requerir privilegios especiales. Esto permite a un atacante construir una lista de usuarios válidos del sistema y utilizarla para ataques de fuerza bruta o phishing dirigido.
userid=XXXXX visible en M.cfg y en atributos data- de elementos del DOM del aula
Dónde está el problema
Configuración global M.cfg inyectada en el HTML
Moodle expone el userId del usuario activo y de otros usuarios visibles en la interfaz
Cómo se corrige
Usar identificadores opacos (UUIDs) en lugar de IDs secuenciales
Restringir qué datos de sesión se exponen en el HTML público
Information DisclosureEnumeraciónSin corregir
#18 Sin TLS 1.3 Alto
El servidor soporta TLS 1.0 y 1.1 (ambos oficialmente obsoletos desde 2020) pero no implementa TLS 1.3, el estándar actual. TLS 1.3 ofrece mejoras significativas de seguridad y rendimiento respecto a versiones anteriores, incluyendo Perfect Forward Secrecy obligatorio y eliminación de algoritmos débiles.
SSL Labs confirma: TLS 1.0 ✗ · TLS 1.1 ✗ · TLS 1.2 ✓ · TLS 1.3 ✗
Dónde está el problema
Configuración SSL/TLS del servidor Apache
La configuración de OpenSSL no restringe versiones obsoletas ni habilita TLS 1.3
Cómo se corrige
En la configuración de Apache:
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384
Seguridad TransporteTLSSin corregir
#19 Sin HSTS (Strict-Transport-Security) Medio
La cabecera HSTS no está configurada, lo que significa que el navegador no sabe que debe acceder siempre al sitio por HTTPS. Un atacante en la misma red puede interceptar la primera solicitud HTTP y redirigir al usuario a una versión insegura del sitio (ataque SSL Stripping).
curl -I: cabecera Strict-Transport-Security ausente en todas las revisiones
Dónde está el problema
Configuración del servidor Apache
Cabecera HTTP no configurada — una línea lo resuelve
Cómo se corrige
Agregar en Apache:
Header always set Strict-Transport-Security
"max-age=31536000; includeSubDomains"
Seguridad TransporteSSL StrippingSin corregir
#20 Cookie MoodleSession sin HttpOnly Crítico
La cookie de sesión de Moodle (MoodleSession) no tiene el atributo HttpOnly, lo que significa que puede ser leída por JavaScript. Si un atacante logra ejecutar código JS en el navegador de la víctima (mediante XSS), puede robar la cookie de sesión completa y secuestrar la cuenta sin necesidad de conocer la contraseña.
curl -I: Set-Cookie: MoodleSession=...; path=/moodle/; secure — HttpOnly ausente
Dónde está el problema
Configuración de sesiones en Moodle (config.php)
La cookie se genera sin el flag HttpOnly que impediría acceso desde JavaScript
Cómo se corrige
En config.php de Moodle:
$CFG->cookiehttponly = true;
O en PHP: session.cookie_httponly = On
Gestión de SesionesXSSSession HijackingSin corregir
#21 PHP/Apache expuesto en headers Medio
Los headers HTTP revelan la versión exacta del servidor y del lenguaje de programación. Esta información permite a un atacante buscar CVEs específicos para Apache 2.4.62 y PHP 8.2.30 sin necesidad de realizar ninguna prueba activa sobre el sistema.
Server: Apache/2.4.62 (Rocky Linux) OpenSSL/3.2.2 · X-Powered-By: PHP/8.2.30
Dónde está el problema
Configuración de Apache y PHP
Por defecto ambos exponen su versión exacta en todas las respuestas HTTP
Cómo se corrige
En Apache: ServerTokens Prod · ServerSignature Off
En PHP: expose_php = Off
Information DisclosureSin corregir
#22 IDs duplicados en HTML (5 casos) Medio
Se detectaron 5 atributos id= duplicados en el mismo documento HTML. Además de ser un error de validación, los IDs duplicados pueden causar comportamientos inesperados en JavaScript y CSS, y dificultar la implementación futura de una Content Security Policy estricta.
IDs duplicados: block-script, css-reconocimientos, css-features, css-databases, css-quick
Dónde está el problema
Directamente en el HTML generado por Moodle/RemUI
La plantilla genera elementos con IDs fijos que se repiten al incluirse múltiples veces
Cómo se corrige
Editar plantilla del tema RemUI para generar IDs únicos dinámicamente
Usar clases CSS en lugar de IDs para elementos que se repiten
Calidad de CódigoHTML InválidoSin corregir
#23 Google Fonts cargado múltiples veces Medio
Google Fonts fue cargado 4 veces en la primera revisión, lo que impacta el rendimiento y expone la IP de cada visitante a Google múltiples veces por carga de página. Aunque fue corregido en la segunda revisión, en la cuarta revisión se detectó una regresión: ahora se carga hasta 10 veces en la versión autenticada y 8 veces en la pública.
1ª rev: 4× · 2ª rev: corregido · 4ª rev (curl): regresión — 10× (autenticada) / 8× (pública)
Dónde está el problema
Múltiples plugins y el tema principal incluyen Google Fonts de forma independiente
Cada componente de Moodle carga su propia copia sin verificar si ya fue cargada
Cómo se corrige
Auto-hospedar las fuentes en el servidor
O centralizar la carga de Google Fonts en un único punto de entrada del tema
PrivacidadRendimientoRegresión
#24 38 errores de contraste (WAVE) Info
WAVE detectó 38 errores de contraste de color en la interfaz del campus. Un contraste insuficiente entre el texto y el fondo dificulta o imposibilita la lectura para usuarios con baja visión o daltonismo, violando los criterios de éxito 1.4.3 y 1.4.6 de WCAG 2.1.
WAVE: 38 contrast errors · 21 errores generales · 208 problemas ARIA · AIM score: 3.1/10
Dónde está el problema
Estilos CSS del tema RemUI/Edwiser
Colores de texto y fondo definidos sin verificar ratios de contraste mínimos (4.5:1 para texto normal)
Cómo se corrige
Usar herramientas como Contrast Checker para verificar todos los colores
Ajustar la paleta del tema para cumplir WCAG 2.1 nivel AA
AccesibilidadWCAG 2.1Sin corregir
#25 Ausencia de X-Content-Type-Options Medio
El servidor no envía la cabecera X-Content-Type-Options: nosniff. Sin ella, los navegadores pueden inferir (sniff) el tipo MIME de una respuesta ignorando el Content-Type declarado. Esto permite ataques donde un archivo HTML disfrazado de imagen se ejecuta como script, ampliando la superficie de ataque XSS.
Verificado mediante: curl -I https://campusvirtual.pucmm.edu.do/moodle/ — cabecera ausente en respuesta
Dónde está el problema
Configuración del servidor Apache — cabecera HTTP no configurada
Cómo se corrige
Agregar en Apache:
Header always set X-Content-Type-Options "nosniff"
Seguridad CabecerasMIME Sniffing 4ª Revisión
#26 Ausencia de Referrer-Policy Medio
Sin la cabecera Referrer-Policy, el navegador envía la URL completa como referrer en cada petición saliente. En una plataforma académica esto puede filtrar información sensible como rutas de cursos, IDs de usuarios o parámetros de sesión a servicios externos (Google Fonts, redes sociales, etc.) a través del header Referer.
Verificado mediante: curl -I https://campusvirtual.pucmm.edu.do/moodle/ — cabecera ausente en respuesta
Dónde está el problema
Configuración del servidor Apache — cabecera HTTP no configurada
Cómo se corrige
Agregar en Apache:
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Seguridad CabecerasFuga de Información 4ª Revisión
#27 Ausencia de Permissions-Policy Bajo
No se encontró la cabecera Permissions-Policy (antes Feature-Policy). Esta cabecera permite al servidor restringir qué APIs del navegador pueden ser usadas por la página y sus iframes: cámara, micrófono, geolocalización, etc. Su ausencia deja estas APIs sin control explícito, lo que podría ser explotado si se logra inyectar contenido en la plataforma.
Verificado mediante: curl -I https://campusvirtual.pucmm.edu.do/moodle/ — cabecera ausente en respuesta
Dónde está el problema
Configuración del servidor Apache — cabecera HTTP no configurada
Cómo se corrige
Agregar en Apache:
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Seguridad CabecerasControl de APIs 4ª Revisión
IV

Análisis por Nivel de Acceso

Nivel 1 — Sin sesión (acceso público)
3,595 líneas · 641.8 KB · Riesgo: CRÍTICO
Token expuesto
sesskey zhkOH2s6Sp sin usuario autenticado
Protecciones ausentes
Sin CSP · Sin X-Frame-Options · Sin Referrer-Policy
Info expuesta
Stack tecnológico completo + 13 rutas internas
Mixed content
5 enlaces HTTP institucionales en página HTTPS
Nivel 2 — Con sesión iniciada
9,587 líneas · 3.4 MB · Superficie 2.6× mayor
Token de sesión activo
sesskey del usuario expuesto en M.cfg del HTML
Timeout revelado
sessiontimeout: 14,400 seg (4 horas) expuesto públicamente
Configuración del usuario
userId, contextId y datos de configuración en el HTML
Superficie de ataque
2.6× más código expuesto que sin sesión
Nivel 3 — Dentro del aula virtual
8,669 líneas · 3.0 MB · Hallazgos nuevos
ID de curso expuesto
courseid=114944 del curso específico visible
Enumeración completa
categoryid 1 hasta 111+ → catálogo académico completo
PDFs sin autenticación
3 documentos institucionales accesibles sin login
Software via HTTP
safeexambrowser.org referenciado sin HTTPS
V

Validación Externa — Herramientas Especializadas

Mozilla Observatory
F
20 / 100 · 4 tests fallidos · Cookie sin HttpOnly (-30), Sin CSP (-25), Sin HSTS (-20), Sin X-Content-Type-Options (-5)
Security Headers
D
5 cabeceras ausentes: CSP, Strict-Transport-Security, X-Content-Type-Options, Referrer-Policy, Permissions-Policy
SSL Labs
B
Capado por TLS 1.0 y 1.1 activos. Sin TLS 1.3. Certificado RSA 2048 bits SHA256withRSA válido.
WAVE Accessibility
3.1/10
21 errores · 38 errores de contraste · 34 alertas · 208 problemas ARIA
W3C HTML Validator — Errores destacados
Error 8+ imágenes sin atributo alt
Error <style> dentro de <div> — ilegal en HTML5
Error 5 IDs duplicados en el documento
Error <img src=""> — src vacío en 2 imágenes
Error </p> sin <p> correspondiente (4 veces)
Error Salto de h1 directo a h6 — jerarquía rota
Warning CSS Parse Error detectado
Warning aria-controls apunta a ID inexistente
Hallazgos adicionales en Raw Server Headers
Server: Apache/2.4.62 (Rocky Linux) OpenSSL/3.2.2 X-Powered-By: PHP/8.2.30 X-Ua-Compatible: IE=edge Expires: Mon, 20 Aug 1969 09:23:00 GMT
El servidor expone su versión exacta de Apache, PHP y OpenSSL en las cabeceras HTTP. La directiva IE=edge indica configuración de compatibilidad con Internet Explorer — un navegador discontinuado en 2022. La fecha de expiración del año 1969 es otro residuo de configuración deficiente.
VI

Recomendaciones por Prioridad

Inmediato — Esta semana
Implementar Content Security Policy como cabecera HTTP en el servidor web
Agregar X-Frame-Options: SAMEORIGIN para prevenir Clickjacking
Investigar y corregir la generación de sesskeys para usuarios no autenticados
Proteger los PDFs institucionales detrás de autenticación
Corto plazo — Próximo ciclo
Reemplazar todos los enlaces HTTP por HTTPS (redes sociales + safeexambrowser)
Implementar UUIDs no secuenciales para IDs de cursos y categorías
Restringir acceso a rutas /admin/ por IP o autenticación adicional
Implementar minificación y ofuscación del código en el proceso de despliegue
Mediano plazo
Migrar los estilos inline restantes a archivos CSS externos
Realizar auditoría completa de accesibilidad (WCAG 2.1)
Mantener actualizadas todas las librerías de terceros (jQuery, YUI, etc.)
Implementar Referrer-Policy: strict-origin-when-cross-origin
Auto-hospedar fuentes para eliminar dependencia de Google Fonts
VII

Alcance y Limitaciones

Este reporte fue elaborado exclusivamente mediante reconocimiento pasivo, utilizando únicamente información disponible públicamente a través del código fuente HTML accesible por cualquier visitante del sitio (Ctrl+U en el navegador). Se analizaron tres snapshots del HTML en dos momentos distintos.

No se realizaron pruebas activas de penetración, inyección de código, ni acceso no autorizado a ningún sistema, base de datos o cuenta de usuario. Todos los hallazgos se basan en análisis estático del código fuente público.

Es posible que existan vulnerabilidades adicionales no detectables mediante reconocimiento pasivo que requieran una auditoría de seguridad completa y autorizada para ser identificadas.

VIII

Evidencias — Herramientas Externas

Security Headers
Nota: D
securityheaders.com · campusvirtual.pucmm.edu.do
Security Headers Report — Nota D
Content-Security-Policy
Strict-Transport-Security
X-Content-Type-Options
Referrer-Policy
Permissions-Policy
X-Frame-Options (corregido)
SSL Labs
Nota: B
ssllabs.com · campusvirtual.pucmm.edu.do
SSL Labs Report — Nota B
TLS 1.0 activo (obsoleto desde 2020)
TLS 1.1 activo (obsoleto desde 2020)
Sin TLS 1.3
Certificado RSA 2048 válido
Cipher Strength adecuado
WAVE Accessibility
AIM: 3.1/10
wave.webaim.org · campusvirtual.pucmm.edu.do/moodle/
WAVE Accessibility Report
21 errores de accesibilidad
38 errores de contraste de color
34 alertas
208 problemas ARIA
curl -I · HTTP Headers (4ª Revisión)
Verificación Directa
curl -I https://campusvirtual.pucmm.edu.do/moodle/ · Thu, 07 May 2026 23:54:11 GMT
curl -I output — HTTP Headers del servidor
X-Frame-Options: sameorigin — Confirmado corregido
BIGipServer cookie con HttpOnly + Secure
OpenSSL 3.2.2 — versión moderna
Cache-Control: no-store, no-cache
MoodleSession sin HttpOnly (solo Secure) — sigue vulnerable a robo vía XSS
Server: Apache/2.4.62 (Rocky Linux) — versión exacta expuesta
X-Powered-By: PHP/8.2.30 — versión exacta expuesta
Content-Security-Policy — ausente
Strict-Transport-Security (HSTS) — ausente
X-Content-Type-Options — ausente
Referrer-Policy — ausente
Permissions-Policy — ausente
Mozilla Observatory
Nota: F · 20/100
observatory.mozilla.org · campusvirtual.pucmm.edu.do/moodle/
Abrir PDF
Scan_results_-_HTTP_Observatory_MDN.pdf
CSP ausente (−25 pts)
Cookie sin HttpOnly (−30 pts)
Sin HSTS (−20 pts)
X-Content-Type-Options (−5 pts)
PHP/8.2.30 expuesto en headers
W3C Nu HTML Checker
Múltiples errores
validator.w3.org · campusvirtual.pucmm.edu.do/moodle/
Abrir PDF
Showing_results_for_https___campusvirtual_pucmm_edu_do_moodle___checked_with_vnu_26_4_24.pdf
8+ imgs sin alt (líneas 114, 116, 363, 530, 3527, 3529, 3541, 3542)
<style> dentro de <div> — ilegal en HTML5 (líneas 562, 625, 668, 781, 856...)
5 IDs duplicados: block-script, css-reconocimientos, css-features, css-databases, css-quick
<img src=""> vacío — líneas 3541 y 3542
<font> obsoleto — línea 638
Salto h1 → h6 directo (jerarquía rota)
Análisis PVA
Reporte
Análisis de Vulnerabilidades del Campus Virtual
Abrir PDF
Analisis PVA.pdf
Documento detallado del Análisis de Seguridad y Vulnerabilidades