
Mautic < 5.2.3 RCE autenticado
La mala sanitización del contenido, tipo y extensión de los archivos subidos en la función de Edición de Asset permite a un atacante autenticado escribir código PHP arbitrario dentro del directorio web y localizar dónde se escribe dicho archivo. Esto resulta en ejecución remota de código.
Un path traversal también permite explotar esta funcionalidad para eliminar recursivamente cualquier directorio del sistema de archivos que el usuario web tenga permiso de modificar.

Al editar un Asset a través de la ruta /assets/view/{assetID}, se da la posibilidad de cambiar el archivo del asset.
La subida de un nuevo archivo finalmente llama a la siguiente función dentro de app/Bundles/AssetBundle/Controller/AssetController.php:
public function editAction(Request $request, UploaderHelper $uploaderHelper, AssetModel $model, $objectId, $ignorePost = false)
La lógica de subida se puede encontrar aquí:
if (!$ignorePost && 'POST' == $method) {
$valid = false;
if (!$cancelled = $this->isFormCancelled($form)) {
if ($valid = $this->isFormValid($form)) {
$entity->setUploadDir($this->coreParametersHelper->get('upload_dir'));
$entity->preUpload();
$entity->upload();
Más concretamente, nos interesan los métodos preUpload() y upload(), ya que manejan la escritura real del archivo en el disco.
El primer defecto se encuentra en preUpload() en app/Bundles/AssetBundle/Entity/Asset.php, ya que la implementación nos permite especificar una extensión de archivo arbitraria (evadiendo así la protección que normalmente proporciona el array allowed_extensions):
$filename = sha1(uniqid(mt_rand(), true));
$extension = $this->getFile()->guessExtension();
if (empty($extension)) {
// get it from the original name
$extension = pathinfo($this->originalFileName, PATHINFO_EXTENSION);
}
$this->path = $filename.'.'.$extension;
La línea $extension = $this->getFile()->guessExtension(); devolverá NULL si proporcionamos un nombre de archivo que termine en .php y contenido que comience con la etiqueta <?php.
Por lo tanto, la comprobación empty($extension) se evaluará como verdadera, y la extensión del archivo se extraerá mediante la llamada a pathinfo(), lo que nos permite subir archivos temporales con contenido y extensión arbitrarios. No podemos controlar el nombre real del archivo, ya que se genera con sha1().
Luego, dentro del método upload() posterior, el archivo se escribirá realmente en el disco dentro del directorio web mediante la siguiente llamada:
$this->getFile()->move($this->getUploadDir(), $this->path);
Está usando nuestra extensión arbitraria (contenida en la variable $this->path). El nombre del archivo se puede recuperar entonces actualizando la página de detalles del Asset (/assets/view/{assetId}), en la entrada Local filename de la tabla.
NB : Esto también funciona alterando las peticiones enviadas al crear un nuevo Asset. Esto llamará a la función newAction(), pero la lógica es idéntica, y los defectos siguen estando en los métodos preUpload() y upload().
El PoC no se publicará durante un mes más o menos.
Esto es para dar tiempo a las organizaciones que dependen de este software a parchearlo sin temer que los script kiddies destrocen sus cosas.
Después de eso, este repositorio se actualizará con el script de explotación completo y las pruebas. De todos modos, ya hay suficiente información en esta página.
Al validar una subida temporal (a través de /s/assets/new o /s/assets/edit/{assetId}), el directorio que almacena el archivo temporal se elimina recursivamente al final de la petición. El parámetro encargado de contener el nombre del directorio temporal es susceptible a ataques de path traversal, lo que permite a un atacante autenticado eliminar cualquier directorio del sistema, siempre que el usuario web tenga permiso para ello. Esto puede resultar en pérdida de datos, o incluso en la destrucción de todo el sistema de archivos si el servidor se ejecuta como usuario root.
Especifique cualquier archivo que exista en el sistema a través del endpoint utilizado a continuación. Si el archivo existe, el servidor intentará eliminar el directorio en el que está almacenado.

Toma de control del servidor Denegación de servicio Pérdida de datos