{"id":"CVE-2026-109972","kind":"vulnerability","aliases":["CVE-2026-109972"],"related":[],"title":"s2Member WordPress plugin: contributor can inject stored script via date_format","description":"The s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'date_format' parameter in all versions up to, and including, <= 261011 due to insufficient input sanitization and output escaping. 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. The payload bypasses wp_kses_post() on save because it contains no literal angle brackets — only backslash-escaped sequences that PHP's date() materializes into HTML tag characters at render time after WordPress's shortcode_parse_atts() applies stripcslashes() to the attribute value.","summary":"The s2Member WordPress membership plugin fails to sanitize the date_format parameter, so a contributor-level user can save a payload that renders as HTML on pages. When a visitor opens an affected page, the injected script runs in their browser.","severity":"medium","cvss":6.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["membership-sites","package","s2member","wordpress"],"not_affected_if":["only-trusted-editors","patched-version","plugin-not-installed"],"how_to_check":"- Check whether the s2Member plugin is installed and its version in the WordPress admin plugins list, or with `wp plugin get s2member --field=version`\n- unknown for the exact vulnerable version range beyond 'up to and including 261011'","fix":"- Update s2Member to a version later than `261011` once the vendor releases a fixed build (fixed version not stated in the sources)\n- Until then, restrict contributor-level accounts and review pages that use the affected date_format parameter","status":"open","published_at":"2026-10-28T07:16:45+00:00","first_seen_at":"2026-10-28T07:31:37+00:00","triaged_at":"2026-10-28T07:33:03+00:00","updated_at":"2026-10-28T07:33:03+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-10-28T07:33:03Z","model":"claude-haiku-5-5","output":{"fix":"- Update s2Member to a version later than `261011` once the vendor releases a fixed build (fixed version not stated in the sources)\n- Until then, restrict contributor-level accounts and review pages that use the affected date_format parameter","reach":"internet","title":"s2Member WordPress plugin: contributor can inject stored script via date_format","impact":"medium","summary":"The s2Member WordPress membership plugin fails to sanitize the date_format parameter, so a contributor-level user can save a payload that renders as HTML on pages. When a visitor opens an affected page, the injected script runs in their browser.","category":"package","nicknames":[],"who_cares":["wordpress","s2member","membership-sites"],"confidence":0.6,"needs_auth":"yes","worst_case":"Attacker script runs in visitors' browsers, hijacking sessions or admin actions","analyst_note":"Find the fixed s2Member version and vendor advisory at the NVD entry or the WordPress plugin changelog, since the sources give no fixed version.","how_to_check":"- Check whether the s2Member plugin is installed and its version in the WordPress admin plugins list, or with `wp plugin get s2member --field=version`\n- unknown for the exact vulnerable version range beyond 'up to and including 261011'","needs_analyst":true,"not_affected_if":["plugin-not-installed","only-trusted-editors","patched-version"],"who_is_affected":"Sites running the s2Member plugin at version `261011` or earlier where contributor-level or higher users can create or edit pages. Sites without s2Member, or where only trusted administrators can write content, face much less exposure.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"medium"},"cost_usd":0.000648,"input_tokens":3493,"output_tokens":598,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-109972':14A,17A '-2026':13A,16A '261011':103C 'access':78C,123C,139C 'affect':57B 'angl':156C 'appli':181C 'arbitrari':128C 'att':180C 'attack':118C 'attribut':185C 'authent':117C 'backslash':160C 'backslash-escap':159C 'bracket':157C 'browser':65B 'bypass':145C 'charact':171C 'contain':153C 'content':74C 'contributor':4A,39B,121C 'contributor-level':38B,120C 'cross':88C 'cross-sit':87C 'cve':12A,15A 'date':10A,33B,93C,166C 'due':104C 'escap':111C,161C 'excel':68C 'execut':135C 'fail':29B 'format':11A,34B,94C 'html':49B,169C 'includ':102C 'inject':6A,60B,127C,141C 'input':107C 'insuffici':106C 'kind':71C 'kses':147C 'level':40B,122C 'liter':155C 'make':113C 'materi':167C 'member':77C 'membership':19B,27B,73C 'membership-sit':18B 'open':55B 'output':110C 'packag':21B 'page':51B,58B,132C,142C 'paramet':35B,95C 'pars':179C 'payload':45B,144C 'paywal':76C 'php':164C 'plugin':3A,28B,80C 'possibl':115C 'post':148C 'render':47B,173C 'restrict':75C 'run':62B 's2member':1A,22B,25B,67C 'sanit':31B,108C 'save':43B,150C 'script':8A,61B,90C,130C 'sequenc':162C 'shortcod':178C 'site':20B,89C 'store':7A,86C 'stripcslash':182C 'subscript':79C 'tag':170C 'time':174C 'user':41B,138C 'valu':186C 'version':98C 'via':9A,91C 'visitor':54B 'vulner':84C 'web':129C 'whenev':136C 'wordpress':2A,23B,26B,82C,176C 'wp':146C","nicknames":[],"mitigations":[],"who_affected":"Sites running the s2Member plugin at version `261011` or earlier where contributor-level or higher users can create or edit pages. Sites without s2Member, or where only trusted administrators can write content, face much less exposure.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T07:16:45+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N","cvss_by":"security@wordfence.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-109972","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-109972","severity":null,"published_at":"2026-10-28T07:16:45+00:00","modified_at":"2026-10-28T07:16:45+00:00","first_seen_at":"2026-10-28T07:31:37+00:00","fetched_at":"2026-10-28T07:31:37+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}