Aprenda e pratique Hacking AWS:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Aprenda e pratique Hacking GCP: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
XML é uma linguagem de marcação projetada para armazenamento e transporte de dados, apresentando uma estrutura flexível que permite o uso de tags nomeadas descritivamente. Ela difere do HTML por não estar limitada a um conjunto de tags predefinidas. A importância do XML diminuiu com o surgimento do JSON, apesar de seu papel inicial na tecnologia AJAX.
* **Representação de Dados através de Entidades**: Entidades em XML permitem a representação de dados, incluindo caracteres especiais como `<` e `>`, que correspondem a `<` e `>` para evitar conflitos com o sistema de tags do XML.
* **Definindo Elementos XML**: XML permite a definição de tipos de elementos, delineando como os elementos devem ser estruturados e que conteúdo podem conter, variando de qualquer tipo de conteúdo a elementos filhos específicos.
* **Definição de Tipo de Documento (DTD)**: DTDs são cruciais em XML para definir a estrutura do documento e os tipos de dados que ele pode conter. Eles podem ser internos, externos ou uma combinação, orientando como os documentos são formatados e validados.
* **Entidades Personalizadas e Externas**: XML suporta a criação de entidades personalizadas dentro de um DTD para representação flexível de dados. Entidades externas, definidas com uma URL, levantam preocupações de segurança, particularmente no contexto de ataques de Entidade Externa XML (XXE), que exploram a forma como os analisadores XML lidam com fontes de dados externas: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
* **Detecção de XXE com Entidades de Parâmetro**: Para detectar vulnerabilidades XXE, especialmente quando métodos convencionais falham devido a medidas de segurança do analisador, entidades de parâmetro XML podem ser utilizadas. Essas entidades permitem técnicas de detecção fora de banda, como acionar consultas DNS ou requisições HTTP para um domínio controlado, para confirmar a vulnerabilidade.
[**A maioria desses ataques foi testada usando os incríveis laboratórios XEE da Portswiggers: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
Em aplicações baseadas em **Java**, pode ser possível **listar o conteúdo de um diretório** via XXE com um payload como (apenas pedindo o diretório em vez do arquivo):
Usando a **técnica comentada anteriormente**, você pode fazer o servidor acessar um servidor que você controla para mostrar que ele é vulnerável. Mas, se isso não estiver funcionando, talvez seja porque **entidades XML não são permitidas**, nesse caso você poderia tentar usar **entidades de parâmetro XML**:
**Nesta ocasião, vamos fazer o servidor carregar um novo DTD com um payload malicioso que enviará o conteúdo de um arquivo via requisição HTTP (para arquivos de várias linhas, você pode tentar exfiltrá-lo via \_ftp://**\_ usando este servidor básico, por exemplo, [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Esta explicação é baseada em** [**Portswiggers lab aqui**](https://portswigger.net/web-security/xxe/blind)**.**
* Uma entidade de parâmetro XML, `%file`, é criada, lendo o conteúdo do arquivo `/etc/hostname`.
* Outra entidade de parâmetro XML, `%eval`, é definida. Ela declara dinamicamente uma nova entidade de parâmetro XML, `%exfiltrate`. A entidade `%exfiltrate` é configurada para fazer uma solicitação HTTP ao servidor do atacante, passando o conteúdo da entidade `%file` dentro da string de consulta da URL.
Este payload define uma entidade de parâmetro XML `%xxe` e a incorpora dentro do DTD. Quando processado por um parser XML, este payload busca o DTD externo do servidor do atacante. O parser então interpreta o DTD inline, executando os passos descritos no DTD malicioso e levando à exfiltração do arquivo `/etc/hostname` para o servidor do atacante.
**Neste caso, vamos fazer o servidor carregar um DTD malicioso que mostrará o conteúdo de um arquivo dentro de uma mensagem de erro (isso é válido apenas se você puder ver mensagens de erro).** [**Exemplo daqui.**](https://portswigger.net/web-security/xxe/blind)
Uma mensagem de erro de parsing XML, revelando o conteúdo do arquivo `/etc/passwd`, pode ser acionada usando um Documento Tipo de Definição (DTD) externo malicioso. Isso é realizado através dos seguintes passos:
1. Uma entidade de parâmetro XML chamada `file` é definida, que contém o conteúdo do arquivo `/etc/passwd`.
2. Uma entidade de parâmetro XML chamada `eval` é definida, incorporando uma declaração dinâmica para outra entidade de parâmetro XML chamada `error`. Esta entidade `error`, quando avaliada, tenta carregar um arquivo inexistente, incorporando o conteúdo da entidade `file` como seu nome.
3. A entidade `eval` é invocada, levando à declaração dinâmica da entidade `error`.
4. A invocação da entidade `error` resulta em uma tentativa de carregar um arquivo inexistente, produzindo uma mensagem de erro que inclui o conteúdo do arquivo `/etc/passwd` como parte do nome do arquivo.
_**Por favor, note que o DTD externo nos permite incluir uma entidade dentro da segunda (****`eval`****), mas isso é proibido no DTD interno. Portanto, você não pode forçar um erro sem usar um DTD externo (geralmente).**_
Uma brecha na especificação da linguagem XML pode **expor dados sensíveis através de mensagens de erro quando o DTD de um documento mistura declarações internas e externas**. Este problema permite a redefinição interna de entidades declaradas externamente, facilitando a execução de ataques XXE baseados em erro. Esses ataques exploram a redefinição de uma entidade de parâmetro XML, originalmente declarada em um DTD externo, a partir de um DTD interno. Quando conexões fora de banda são bloqueadas pelo servidor, os atacantes devem confiar em arquivos DTD locais para conduzir o ataque, visando induzir um erro de análise para revelar informações sensíveis.
Considere um cenário onde o sistema de arquivos do servidor contém um arquivo DTD em `/usr/local/app/schema.dtd`, definindo uma entidade chamada `custom_entity`. Um atacante pode induzir um erro de análise XML revelando o conteúdo do arquivo `/etc/passwd` ao submeter um DTD híbrido da seguinte forma:
* Uma redefinição ocorre para a entidade de parâmetro XML `custom_entity`, originalmente definida no DTD externo, para encapsular um [exploit XXE baseado em erro](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Esta redefinição é projetada para provocar um erro de análise, expondo o conteúdo do arquivo `/etc/passwd`.
* Ao empregar a entidade `local_dtd`, o DTD externo é ativado, abrangendo a nova entidade definida `custom_entity`. Esta sequência de ações precipita a emissão da mensagem de erro pretendida pelo exploit.
**Exemplo do mundo real:** Sistemas que utilizam o ambiente de desktop GNOME frequentemente têm um DTD em `/usr/share/yelp/dtd/docbookx.dtd` contendo uma entidade chamada `ISOamso`
Como esta técnica usa um **DTD interno, você precisa encontrar um válido primeiro**. Você pode fazer isso **instalando** o mesmo **SO / Software** que o servidor está usando e **procurando alguns DTDs padrão**, ou **pegando uma lista** de **DTDs padrão** dentro dos sistemas e **verificando** se algum deles existe:
Além disso, se você tiver a **imagem Docker do sistema da vítima**, pode usar a ferramenta do mesmo repositório para **escanear** a **imagem** e **encontrar** o caminho dos **DTDs** presentes dentro do sistema. Leia o [Readme do github](https://github.com/GoSecure/dtd-finder) para aprender como.
Para uma explicação mais detalhada deste ataque, **verifique a segunda seção de** [**este post incrível**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **da Detectify**.
A capacidade de **fazer upload de documentos do Microsoft Office é oferecida por muitas aplicações web**, que então procedem a extrair certos detalhes desses documentos. Por exemplo, uma aplicação web pode permitir que os usuários importem dados fazendo upload de uma planilha no formato XLSX. Para que o parser extraia os dados da planilha, ele inevitavelmente precisará analisar pelo menos um arquivo XML.
Para testar essa vulnerabilidade, é necessário criar um **arquivo do Microsoft Office contendo um payload XXE**. O primeiro passo é criar um diretório vazio para o qual o documento pode ser descompactado.
Uma vez que o documento tenha sido descompactado, o arquivo XML localizado em `./unzipped/word/document.xml` deve ser aberto e editado em um editor de texto preferido (como vim). O XML deve ser modificado para incluir o payload XXE desejado, geralmente começando com uma solicitação HTTP.
Finalmente, o arquivo pode ser compactado para criar o arquivo malicioso poc.docx. A partir do diretório "unzipped" previamente criado, o seguinte comando deve ser executado:
Agora, o arquivo criado pode ser enviado para a aplicação web potencialmente vulnerável, e pode-se esperar que uma solicitação apareça nos logs do Burp Collaborator.
O **jar** protocolo é acessível exclusivamente dentro de **aplicações Java**. Ele é projetado para permitir o acesso a arquivos dentro de um **PKZIP** archive (por exemplo, `.zip`, `.jar`, etc.), atendendo tanto a arquivos locais quanto remotos.
Para poder acessar arquivos dentro de arquivos PKZIP é **super útil para abusar de XXE via arquivos DTD do sistema.** Confira [esta seção para aprender como abusar de arquivos DTD do sistema](xxe-xee-xml-external-entity.md#error-based-system-dtd).
Uma técnica interessante para interromper esse processo na segunda etapa envolve manter a conexão do servidor aberta indefinidamente ao servir o arquivo do arquivo. Ferramentas disponíveis neste [repositório](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) podem ser utilizadas para esse propósito, incluindo um servidor Python (`slow_http_server.py`) e um servidor Java (`slowserver.jar`).
Escrever arquivos em um diretório temporário pode ajudar a **escalar outra vulnerabilidade que envolve uma travessia de caminho** (como inclusão de arquivo local, injeção de template, XSLT RCE, desserialização, etc).
Ao integrar dados do cliente em documentos XML do lado do servidor, como aqueles em solicitações SOAP de backend, o controle direto sobre a estrutura XML é frequentemente limitado, dificultando ataques XXE tradicionais devido a restrições na modificação do elemento `DOCTYPE`. No entanto, um ataque `XInclude` oferece uma solução ao permitir a inserção de entidades externas dentro de qualquer elemento de dados do documento XML. Este método é eficaz mesmo quando apenas uma parte dos dados dentro de um documento XML gerado pelo servidor pode ser controlada.
Para executar um ataque `XInclude`, o namespace `XInclude` deve ser declarado, e o caminho do arquivo para a entidade externa pretendida deve ser especificado. Abaixo está um exemplo sucinto de como tal ataque pode ser formulado:
Arquivos enviados por usuários para certas aplicações, que são então processados no servidor, podem explorar vulnerabilidades na forma como arquivos XML ou formatos de arquivo que contêm XML são tratados. Formatos de arquivo comuns, como documentos de escritório (DOCX) e imagens (SVG), são baseados em XML.
Quando os usuários **enviam imagens**, essas imagens são processadas ou validadas no lado do servidor. Mesmo para aplicações que esperam formatos como PNG ou JPEG, a **biblioteca de processamento de imagens do servidor também pode suportar imagens SVG**. O SVG, sendo um formato baseado em XML, pode ser explorado por atacantes para enviar imagens SVG maliciosas, expondo assim o servidor a vulnerabilidades XXE (XML External Entity).
Em ambos os casos, o formato SVG é usado para lançar ataques que exploram as capacidades de processamento XML do software do servidor, destacando a necessidade de validação robusta de entrada e medidas de segurança.
**Observe que a primeira linha do arquivo lido ou do resultado da execução aparecerá DENTRO da imagem criada. Portanto, você precisa ser capaz de acessar a imagem que o SVG criou.**
Se uma solicitação POST aceitar os dados no formato XML, você pode tentar explorar um XXE nessa solicitação. Por exemplo, se uma solicitação normal contiver o seguinte:
Para alterar a solicitação, você pode usar uma extensão do Burp chamada “**Content Type Converter**“. [Aqui](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) você pode encontrar este exemplo:
Você pode usar a \[**"Receita de Codificação"** do cyberchef aqui ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)para]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29para](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29para)) transformar para UTF-7.
Se a web estiver usando PHP, em vez de usar `file:/` você pode usar **php wrappers**`php://filter/convert.base64-encode/resource=` para **acessar arquivos internos**.
Você pode criar uma **entidade dentro de uma entidade** codificando-a com **html entities** e então chamá-la para **carregar um dtd**.\
Note que as **HTML Entities** usadas precisam ser **numéricas** (como \[neste exemplo]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
Este exemplo é inspirado em [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (Formato de Arquivo de Intercâmbio de Localização XML) é utilizado para padronizar a troca de dados em processos de localização. É um formato baseado em XML, principalmente usado para transferir dados localizáveis entre ferramentas durante a localização e como um formato comum de intercâmbio para ferramentas CAT (Tradução Assistida por Computador).
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
Esta abordagem revela que o User Agent indica o uso do Java 1.8. Uma limitação observada nesta versão do Java é a incapacidade de recuperar arquivos que contenham um caractere de nova linha, como /etc/passwd, usando a técnica Out of Band.
Exfiltração de Dados Baseada em Erros Para superar essa limitação, uma abordagem Baseada em Erros é empregada. O arquivo DTD é estruturado da seguinte forma para acionar um erro que inclui dados de um arquivo alvo:
O servidor responde com um erro, refletindo importantemente o arquivo inexistente, indicando que o servidor está tentando acessar o arquivo especificado:
Esta modificação leva à exfiltração bem-sucedida do conteúdo do arquivo, conforme refletido na saída de erro enviada via HTTP. Isso indica um ataque XXE (XML External Entity) bem-sucedido, aproveitando tanto técnicas Out of Band quanto Error-Based para extrair informações sensíveis.
XMLDecoder é uma classe Java que cria objetos com base em uma mensagem XML. Se um usuário malicioso conseguir fazer um aplicativo usar dados arbitrários em uma chamada ao método **readObject**, ele ganhará instantaneamente a execução de código no servidor.
* Extrair informações via HTTP usando seu próprio DTD externo: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
Aprenda e pratique Hacking AWS:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Aprenda e pratique Hacking GCP: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).