Faaalaaa Galeraaa, trazendo mais um post pra vocês, dessa vez vamos falar sobre uma falha que está em 4 lugar nas falhas mais comuns em aplicações WEB de acordo com a OWASP (click aqui pra ver o TOP 10 falhas da OWASP).

Um dos grandes motivos que me inspirou para escrever esse post e também gravar um vídeo mostrando como essa falha funciona, foi por que um hacker reportou essa falha para o twitter e eles pagaram $10k trumps para o hacker:

Twitter disclosed on HackerOne: XXE on sms-be-vip.twitter.com in...
Hi team, ##What type of issue are you reporting? Does it align to a CWE or OWASP issue? I’ve identified an XXE vulnerability in the cloudhopper sxmp servlet on sms-be-vip.twitter.com which...

XML External Entity Injection

Antes de iniciarmos com a falha, precisamos entender como o XML funciona, e pra isso, vou usar o exemplo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<user>
<nome>Carlos Vieira</nome>
<cargo>Pentester</cargo>
<email>[email protected]</email>
</user>

Podemos ver no exemplo acima, como usamos a estrutura de um XML, ele funciona com chave > parâmetro.

Temos sempre uma tag ROOT (objeto principal), nesse caso a tag root é o <user></user>.

O servidor precisa dessa estrutura para devidamente interpretar o conteúdo do arquivo XML.

Sabendo que temos essa estrutura, o ataque consiste em injetar uma entidade externa dentro da tag root e fazer com que o servidor processe esta entidade, e quanto processar executar um comando malicioso dentro do servidor.

Para criarmos uma payload efetiva para este ataque, vamos usar um teste simples de injeção:

Uma entidade precisa ter um nome e um valor, e você precisa colocar ela entre a tag do HEADER (<?xml version="1.0" encoding="UTF-8"?>) e a tag root, esse caso o <user></user>.

Teríamos algo como:

<?xml version="1.0" encoding="UTF-8"?>
<DOCTYPE crowsec [<ENTITY entidade "valor da entidade">]>
<user>
<nome>Carlos Vieira</nome>
<cargo>Pentester</cargo>
<email>[email protected]</email>
</user>

Criarmos uma entidade chamada "entidade" com o valor "valor da entidade", então agora que criarmos e injetamos nossa entidade no documento XML, podemos usar ela pra alterar valores do nosso documento, seguindo essa mesma linha, podemos mudar qualquer valor dentro do documento.

Podemos injetar nossa entidade no cago por exemplo e trocar por outro valor, algo como:

<?xml version="1.0" encoding="UTF-8"?>
<DOCTYPE crowsec [<ENTITY entidade "novo cargo">]>
<user>
<nome>Carlos Vieira</nome>
<cargo>&entidade;</cargo>
<email>[email protected]</email>
</user>

Note que trocamos o valor da chave "cargo" para &entidade; isso representa a injeção da nossa entidade dentro do documento XML e trocando o valor do cargo de "Pentester" para "novo cargo".

Até aqui nada de mais neah ?

Lembrando que todo esse processamento acontece no lado do servidor, ou seja, podemos injetar qualquer coisa dentro da nossa entidade, que tal usarmos um arquivo de dentro do servidor, como valor da nossa entidade ?

<?xml version="1.0" encoding="UTF-8"?>
<DOCTYPE crowsec [<ENTITY entidade SYSTEM "/etc/passwd">]>
<user>
<nome>Carlos Vieira</nome>
<cargo>&entidade;</cargo>
<email>[email protected]</email>
</user>

Note agora que o valor da nossa entidade é o conteúdo do arquivo /etc/passwd do servidor alvo, então o valor do cargo vai ter o conteúdo parecido com isso: root:x:0:0:root:/root:/bin/bash

Esse ataque permite com que qualquer pessoa possa pegar informações de arquivos de dentro do servidor e até conseguir executar comandos dentro do servidor!

Se você quiser ver essa exploração na prática em um sistema, da uma olhada nesse video:

Espero que você tenha gostado dessa falha, lembre-se de sempre praticar !!!

Use os Labs gratuitos da PortSwigger:

Web Security Academy: Free Online Training from PortSwigger
The Web Security Academy is a free online training center for web application security, brought to you by PortSwigger. Create an account to get started.

Abraço,
Kadu