
Upload Arbitrário de Arquivos sem Autenticação no Plugin EventPrime
Aviso Legal: Este repositório foi criado apenas para fins educacionais e divulgação ética. A vulnerabilidade foi reportada de forma responsável ao fornecedor e corrigida. Não use estas informações para explorar sistemas sem a devida autorização.
Uma vulnerabilidade de Upload Arbitrário de Arquivo Não Autenticado foi descoberta no plugin EventPrime para WordPress (versões <= 4.2.8.1). Essa falha permite que qualquer visitante não autenticado envie arquivos diretamente para o diretório uploads do WordPress e crie registros de anexos na Biblioteca de Mídia.
A vulnerabilidade existe porque um endpoint AJAX específico é explicitamente registrado com nopriv (acessível publicamente) e não possui verificações de autorização nem validação adequada do conteúdo do arquivo. Atacantes podem abusar desse endpoint para causar esgotamento de armazenamento, inundar a biblioteca de mídia ou potencialmente enviar payloads maliciosos disfarçados de imagens.
<= 4.2.8.1A causa raiz é uma combinação de registro inseguro de hooks AJAX e validação insuficiente de arquivos.
1. Registro Inseguro do Endpoint AJAX:
Em includes/class-eventprime-event-calendar-management.php, o plugin registra a ação upload_file_media. Por volta da linha 557, ele define {upload_file_media: true} em seu mapa de ações, onde true indica suporte a _nopriv. Consequentemente, o gwp_ajax_nopriv_ep_upload_file_media` hook é registrado, tornando o endpoint acessível a qualquer pessoa.
2. Ausência de Verificações de Autorização e Nonce:
A função manipuladora upload_file_media() (em includes/class-ep-ajax.php, linhas 1659-1697) não usa current_user_can() para verificar privilégios de upload, nem verifica um nonce de segurança.
3. Lógica de Validação Falha:
O manipulador valida apenas a extensão do arquivo (ex.: jpg/jpeg/png/gif) com base no nome de arquivo fornecido pelo cliente (linhas 1661-1664). Ele não executa uma validação robusta de conteúdo no lado do servidor (como getimagesize() ou wp_check_filetype_and_ext()). Isso implica que scripts maliciosos ou outros tipos de arquivo renomeados para harmless.jpg serão gravados no disco antes que o WordPress tente gerar os metadados.
4. Persistência:
O arquivo é salvo usando move_uploaded_file() diretamente em wp_upload_dir()['path'] e um anexo do WordPress é criado via wp_insert_attachment().
images), isso poderia levar à Execução Remota de Código (RCE).1. Prepare o Payload: Crie um arquivo de imagem de exemplo em sua máquina local chamado poc.jpg.
2. Execute a Requisição: Envie uma requisição POST multipart/form-data para o endpoint AJAX público, sem nenhum cookie de sessão:
curl -i \
-F "[email protected];filename=poc.jpg" \
"http://TARGET_SITE/wp-admin/admin-ajax.php?action=ep_upload_file_media"
3. Observe a Resposta: O servidor responderá com um 200 OK e retornará um objeto JSON contendo o ID do anexo recém-criado:
{"success":true,"data":{"attachment_id":117}}
4. Verificação:
wp-content/uploads/<year>/<month>/poc.jpg.Para resolver esta vulnerabilidade, os desenvolvedores devem:
nopriv se o upload, por design, for apenas para usuários autenticados.current_user_can('upload_files') para garantir que apenas usuários autorizados e privilegiados possam fazer upload.check_ajax_referer() para prevenir ataques de CSRF.wp_handle_upload()), que realizam verificações mais rigorosas de tipo MIME e conteúdo.