Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Stored XSS requires victim page view (UI:R per CVSS guidance); contributor access required (PR:L); scope changes to victim browser (S:C); no availability impact.
Primary rating from Vendor (Wordfence).
CVSS VectorVendor: Wordfence
Lifecycle Timeline
2DescriptionCVE.org
The LearnPress plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'class_wrapper_form' shortcode attribute in versions up to, and including, 4.4.0. This is due to insufficient input sanitization and output escaping in the FilterCourseTemplate::sections() method at line 98, where the attacker-controlled attribute is inserted into an HTML class attribute via sprintf('<form class="%s">', $class_wrapper_form) without esc_attr() escaping. The FilterCourseShortcode::render() handler does not apply shortcode_atts() filtering, so raw user attributes flow directly through do_action('learn-press/filter-courses/layout', $data) into the template. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
AnalysisAI
Stored Cross-Site Scripting in the LearnPress WordPress LMS plugin (versions up to and including 4.4.0) allows authenticated contributors to permanently inject arbitrary JavaScript into WordPress pages via the unescaped 'class_wrapper_form' shortcode attribute. The payload persists in the database and executes in the browser of any visitor - including administrators - who loads the affected page, enabling session hijacking, credential harvesting, or privilege escalation through forged admin actions. No CISA KEV listing or public exploit code has been identified at time of analysis, but the Wordfence advisory includes precise code-level references that substantially lower the bar for independent reproduction.
Technical ContextAI
LearnPress is a WordPress LMS plugin by ThimPress (CPE: cpe:2.3:a:thimpress:learnpress_-_wordpress_lms_plugin_for_create_and_sell_online_courses:*:*:*:*:*:*:*:*) used for creating and selling online courses. The vulnerability is classified as CWE-79 (Improper Neutralization of Input During Web Page Generation). The root cause is a two-part failure: first, FilterCourseShortcode::render() at inc/Shortcodes/Course/FilterCourseShortcode.php:29 omits WordPress's standard shortcode_atts() call, which would normally whitelist and default-sanitize any shortcode attribute. Second, the raw attacker-supplied attribute value travels through a do_action('learn-press/filter-courses/layout', $data) hook into FilterCourseTemplate::sections() at inc/TemplateHooks/Course/FilterCourseTemplate.php:98, where it is interpolated directly into an HTML class attribute via sprintf('<form class="%s">', $class_wrapper_form) without WordPress's esc_attr() escaping function. An attacker can close the attribute with a double-quote and inject inline event handlers or script tags that become part of the stored page HTML.
RemediationAI
Update LearnPress to a version above 4.4.0; the upstream fix is available in WordPress plugin Trac changeset 3587186 (https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&old=3587186%40learnpress&new=3587186%40learnpress), though an exact patched release version is not independently confirmed from the available data - verify in the WordPress.org plugin changelog before deploying. If immediate patching is not possible, the most effective compensating control is disabling contributor-level (and potentially author-level) publishing capability via the WordPress roles editor or a capability manager plugin, which prevents untrusted users from publishing pages containing shortcodes; the trade-off is that legitimate contributors lose publishing rights until the patch is applied. Alternatively, a mu-plugin or filter snippet can remove the 'learn-press/filter-courses' shortcode handler globally, eliminating the attack surface at the cost of disabling course-filter UI elements site-wide. Monitor the Wordfence advisory at https://www.wordfence.com/threat-intel/vulnerabilities/id/09c8db69-60fa-4087-9096-5d34ce44f616 for confirmed patched version numbers.
Unauthenticated data deletion in LearnPress WordPress LMS plugin (versions ≤4.3.2.8) allows remote attackers to delete a
Sensitive information exposure in the LearnPress LMS plugin for WordPress (versions up to and including 4.4.1) lets unau
Course enrollment data exposure in LearnPress WordPress LMS plugin (all versions through 4.3.9.1) enables authenticated
Stored Cross-Site Scripting in LearnPress WordPress LMS Plugin up to version 4.3.3 allows authenticated contributors to
Sensitive information exposure in LearnPress WordPress LMS Plugin (all versions through 4.3.6) allows unauthenticated re
SQL injection in the LearnPress WordPress LMS plugin (versions ≤ 4.4.4) allows authenticated administrators to extract a
Unauthorized option-write in LearnPress (WordPress LMS plugin) versions up to and including 4.4.4 allows authenticated a
The LearnPress WordPress LMS Plugin contains a missing capability check vulnerability in the delete_question_answer() fu
Payment bypass in LearnPress WordPress LMS Plugin (all versions ≤ 4.3.5) allows authenticated subscribers to enroll in a
Same weakness CWE-79 – Cross-site Scripting (XSS)
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-40934
GHSA-qrp7-xr7v-h39q