XXE

O Ataque XXE acontece quando uma requisição utilizando XML é tratada de forma insegura, possibilitando assim a injeção de comandos, a queda do serviço e/ou o acesso direto aos arquivos. Uma das formas mais comuns de exploração é o caso de campos de upload de arquivo, em que o arquivo importado tem efeito direto na aplicação. É importante ressaltar que arquivos com outras extensões como docx, pptx, pdf, entre outros, também possuem dados em XML em sua construção. Logo, o ataque não se limita apenas à passagem simples de dados em XML nas requisições ou apenas a arquivos de extensão xml.

Estrutura do XML

TIPO
DESCRIÇÃO
EXEMPLO

Tag

The keys of an XML document, usually wrapped with (</>) characters

<date>

Entity

XML variables, usually wrapped with (&/;) characters

&lt;

Element

The root element or any of its child elements, and its value is stored in between a start-tag and an end-tag

<date>01-01-2022</date>

Attribute

Optional specifications for any element that are stored in the tags, which may be used by the XML parser

version="1.0"/encoding="UTF-8"

Declaration

Usually the first line of an XML document, and defines the XML version and encoding to use when parsing it

<?xml version="1.0" encoding="UTF-8"?>

Agora vamos nos atentar a algumas regras básicas da estrutura do xml, que são elas:

  • Precisa sempre ter um elemento raiz

  • Todos os elementos precisam ter uma tag de fechamento

  • Atributos XML precisam de aspas

  • Caracteres especiais (<, >, &, ' e ") precisam ter escapes

  • Espaço em branco é reservado no XML

Para definir que o arquivo é um XML, seu arquivo deve conter um dos seguintes inícios:

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="ISO-8859-1"?>

Exemplo de um XML válido:

Entendendo o XXE

Para fins de exemplo, vamos sempre utilizar a estrutura abaixo, simulando que isso é o padrão quando preenchemos um formulário e é então enviado via POST. Ao fazermos isso, o resultado do campo name é refletido na página HTML.

Uma maneira simples de alterarmos a saída, é utilizando um DTD no início do XML. No exemplo abaixo, irá imprimir XXE ATACK!!

Note que, em nosso exemplo, a entrada XML na solicitação HTTP não tinha DTD declarada nos próprios dados XML ou referenciada externamente, então adicionamos uma nova DTD antes de definir nossa entidade. Se o DOCTYPE já estivesse declarado na requisição XML, adicionaríamos apenas o elemento ENTITY a ele.

LFI

Lendo arquivos simples

Lendo arquivos em base64 (necessário para bypassar os caracters <, > e &).

CDATA

Primeiro execute os seguintes comandos no host atacante:

Agora envie a seguinte solicitação para o host alvo

Error Based XXE

Procure algum ponto onde possa causar um erro de XXE. Por exemplo, coloque uma Entity que não exista em algum lugar do XML: <name>&entityInexistente;</name>. Outra forma de causar um erro, é deixando alguma tag aberta ou utilizando caractes como <, > e & para quebrar o XML. Geralmente o erro tem o seguinte formato (em aplicações desenvolvidas em PHP):

Agora crie um arquivo no host alvo chamado xxe.dtd com o seguinte conteúdo:

Feito isso, envieo seguinte payload para o host alvo:

Out-of-Bound Data Exfiltration

Crie um arquivo chamado xxe.dtd com o seguinte conteúdo:

Crie também um arquivo chamado index.php com o conteúdo abaixo:

Agora basta executar o comando abaixo para receber as requisições:

Agora no alvo, envie:

O conteúdo do arquivo /etc/passwd do host alvo irá ser exibido no terminal onde está executando o PHP.

Acessando Arquivos (LFI / RFI)

Antes de realizar um LFI ou RFI, atente-se ao tipo de arquivo que irá ler, pois não podemos ler arquivos com os caracteres <, > e &, já que eles quebram a estrutura do XML. Ao nos depararmos com essa situação, precisamos por exemplo, dcodificar o arquivo antes. Um exemplo de encode para esse cenário, é quando lemos arquivos PHP, que precisamos converter em base64 com a sintaxe abaixo, que deve ser substituída pelo file:///path/to/file

Internos

Caso a aplicação utilize PHP, podemos ler arquivos convertendo-os em base64.

Externos

O ELEMENT pode ser qualquer coisa. O xxe é a "variável" onde o conteúdo de /etc/passwd é armazenado. Ao desmarcá-lo na tag foo, o conteúdo é gerado. Dessa maneira, um invasor pode ler arquivos do sistema local. O SYSTEM significa que o que deve ser incluído pode ser encontrado localmente no sistema de arquivos.

circle-check

Remote Code Execution

Se o módulo expect do PHP estiver carregado (o que é cada mais difícil de achar), podemos obter o RCE (Remote Code Execution)

Refletindo Conteúdo

XXEInjector

Primeiro intecepte a página com o burp e salve em um arquivo. Nesse arquivo, não coloque todo o XML, mas sim somente a primeira linha, e depois XXEINJECT. Segue abaixo um exemplo

Agora execute o XXEInjector, com o seguinte comando:

circle-info

ATENÇÃO: Mesmo quando o resultado for negativo, verifique no diretório Logs, se há alguma arquivo. Muitas vezes o XXE teve êxito e salva em um arquivo, porém não é exibido no terminal

XPath

XPath é uma linguagem de consulta (query), que seleciona nós de um documento XML. Imagine que o documento XML seja banco de dados e o XPath seja o responsável por realizar as consulta. Assim como o SQL Injection, é possível manipular essas consultas e conseguir acesso a mais elementos, obtendo assim mais informações. Podemos pegar resultados nos nós parentes, como no exemplo abaixo:

DoS

Essa técnica não funciona nas versões mais recentes do Apache, pois foi implementado uma proteção contra self-reference (auto-referência))

Como se Proteger

LINGUAGEM

SOLUÇÃO

PHP

Desabilitar a lib libxml_disable_entity_loader mitiga este tipo de problema

Java

Aplicações que utilizam bibliotecas XML costumam ser vulneráveis por possibilitarem de forma padrão o uso de entidades externas. É necessário desativá-las

C / C++

Para a biblioteca libxml2, as opções XML_PARSE_NOENT e XML_PARSE_DTDLOAD não devem ser definidas

---

Sites

Last updated

Was this helpful?