Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2018-7747 — CalderaForms 1.5.9.1 XSS (WordPress plugin) - tutorial | Kitploit
Ferramentas/GitHubGitHub/mindpr00f/cve-2018-7747
Análise de VulnerabilidadesExploração de Aplicações WebSegurança WebCTFTestes de PenetraçãoAprendizado e Educação
GitHubmindpr00f/cve-2018-7747

CVE-2018-7747

CalderaForms 1.5.9.1 XSS (WordPress plugin) - tutorial

Ver Repositório
12há 8 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2018-7747 CalderaForms 1.5.9.1 XSS (plugin WordPress) - tutorial


CalderaForm é um plugin para WordPress que permite criar facilmente formulários através de drag and drop. Durante uma atividade recente, testei alguns portais, um dos quais hospedava exatamente um formulário de contato criado através deste plugin. A configuração personalizada da instância em questão me permitiu encontrar uma vulnerabilidade: dada sua natureza simples, de manual, acredito que seja um bom pretexto para ilustrar alguns mecanismos para iniciantes.

Propósito exclusivamente didático - não utilize estas informações para testar alvos sem autorização explícita nem para fins ilícitos - não mergulhe em água fria durante a digestão - vista-se em camadas quando está calor

Para o exploit completo:
https://www.exploit-db.com/exploits/44489/
Para a CVE:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7747


CONFIGURAÇÃO

Na configuração analisada, o formulário estava configurado para responder com uma mensagem de agradecimento direcionada ao usuário, chamando-o pelo nome recém-inserido.

Para replicar o ambiente de teste, instale localmente uma instância do WordPress e instale o plugin CalderaForms versão 1.5.9.1 (disponível aqui ou aqui).

Uma vez instalado, a partir do console administrativo do WordPress > coluna esquerda > "Caldera Forms" > botões superiores > "New Form" > selecione Contact Form, renomeie e "Create Form"

alt text

Uma vez criado, é possível modificar sua configuração: botões superiores > "Form Settings" > modificar o Success Message para incluir um dos dados inseridos pelo usuário. Clique na caixa e aparece um menu suspenso de sugestões.
Adicionar %first_name%

alt text

Botões superiores > "Save Form"

Para inserir o formulário em uma página: coluna esquerda > "Pages" > "Sample Page" > "Edit" > "Caldera Form" > selecionar o formulário recém-criado > "Insert Form" > coluna direita > "Update"

alt text

Pronto.


RECONHECIMENTO E IDENTIFICAÇÃO DO VETOR

Vamos abordar um a um os passos necessários para construir esse tipo de ataque, segundo o paradigma dividir para conquistar.

Em fase de teste, ao interagir com um componente, é preciso sempre prestar atenção às suas reações com base nos estímulos dados; em particular, focamos no "caminho" dos dados que inserimos e nas eventuais transformações que eles sofrem.

Um exemplo específico para o nosso caso é o seguinte:

  1. Visitamos a página contendo o formulário: http://127.0.0.1/wordpress/sample-page/

  2. Preenchemos o formulário com os seguintes dados
    "First Name": myName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  3. Os dados são processados de acordo com a lógica do plugin

  4. A mensagem de agradecimento recebida contém a stringa que inserimos no campo First Name
    "Thank you myName, form has been successfully submitted."

alt text

A string que inserimos no campo "First Name" nos é retornada na mensagem de agradecimento.
Em particular, a string está contida em um tag div HTML.
Nosso input vai parar no HTML da página.
Consideração: "Gostamos. Temos um ponto de contato."

Damos um passo adiante. Como nosso input é tratado durante a fase que chamamos de "processamento" (ponto 2)? Em particular, o que queremos saber é: temos limitações nos caracteres (e suas combinações) que podemos usar? Obviamente o objetivo é conseguir injetar "coisas". Ao tentar realizar uma injeção, é preciso ter em mente onde nosso input termina e usar "a linguagem" adequada.

Nosso input é processado por um interpretador SQL? Precisamos falar sua língua
Nosso input é processado por um script PHP? Precisamos falar sua língua
Nosso input vai parar em uma página HTML? ...

Então, o que nos interessa é entender se podemos usar os caracteres e construções típicos do HTML e, em particular, dada a capacidade desta linguagem de conter/interpretar código JavaScript, entender se encontramos uma estratégia para inserir nosso código na "zona de pouso", ou seja, o tag div observado anteriormente.

Para fazer isso, inserimos no campo "First Name" uma simples tag HTML e vemos se ela é "sanitizada" (do inglês sanitized), ou seja, se é modificada de modo a ser tornada inócua/não interpretável, ou se nos é retornada tal qual. Usamos para isso uma tag <br>, utilizada para inserir uma quebra de linha no texto.

Seguindo a numeração anterior:

  1. Preenchemos o formulário com os seguintes dados
    "First Name": m<br>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. A mensagem de agradecimento contém nossa tag HTML, que não foi modificada, e ela é corretamente interpretada, inserindo uma quebra de linha no meio da mensagem

"Thank you m  
yName, form has been successfully submitted."

alt text

Consideração: "Gostamos. Podemos usar os símbolos menor-que e maior-que, podemos inserir tags HTML que não são sanitizadas e são interpretadas."

Passo adiante. Substituímos a tag de formatação por algo mais útil, como uma tag <script>, que nos permite inserir e executar código JavaScript dentro da página.

  1. Preenchemos o formulário com os seguintes dados
    "First Name": m<script>alert(1);</script>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. A mensagem de agradecimento contém nossa tag HTML, que não foi modificada, e ela é corretamente interpretada, mostrando-nos uma caixa de alert

alt text

Consideração 1: "Gostamos. Podemos executar código JavaScript arbitrário no contexto do navegador do usuário."
Consideração 2: "Não gostamos. O usuário que executa o JavaScript somos nós mesmos"


STORE & RECALL

A situação é esta: podemos executar JavaScript através de um site não controlado por nós no contexto do navegador de um usuário, mas este usuário, no momento, é o mesmo que insere os valores no formulário. Tudo isso é bastante inútil.
A ideia é esta: existe uma maneira de chamar a mensagem de agradecimento contendo nosso código a ser executado?

Voltemos ao nosso primeiro envio, o de "reconhecimento" (ou reexecutemos os primeiros passos).

Analisando o tráfego de rede ou o código-fonte da página, entendemos que o formulário executa uma requisição POST para o endereço

http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4

(a última parte pode variar, modifique-a apropriadamente em todos os exemplos que seguem)
ou seja, para o endereço

http://<target>/cf-api/<form-id>

e que a resposta desta requisição é um JSON contendo alguns dados, incluindo a mensagem de agradecimento, e com a seguinte estrutura:

{
      "data":
          {"cf_id":"48"},
      "html":"<div class=\" alert alert-success\">Thank you myName, form has been successfully submitted.<\/div>",
      "type":"complete",
      "form_id":"CF5ad9b3176c0f4",
      "form_name":"MyContactForm",
      "status":"complete"
}

guardemos esta informação, voltaremos a ela em breve; especialmente notemos os campos "form_id" e "cf_id".

Baixar ferramenta