Inyeccion en Generacion de PDF
Inyectar HTML o JavaScript en templates de generacion de PDF permite a los atacantes leer archivos del servidor, hacer requests a la red interna o ejecutar scripts en el visor de PDF.
Cómo Funciona
Muchas aplicaciones generan PDFs desde templates HTML usando librerias como Puppeteer, wkhtmltopdf o WeasyPrint. Cuando el input del usuario se inserta en el template HTML sin sanitizacion, los atacantes pueden inyectar HTML y JavaScript maliciosos. Como el motor de PDF renderiza el HTML en el servidor, los scripts inyectados se ejecutan con contexto del lado del servidor. Un atacante puede usar tags <script> para leer archivos locales via XMLHttpRequest('file:///etc/passwd'), hacer requests a servicios internos (SSRF) o exfiltrar variables de entorno. El PDF resultante contiene los datos filtrados, que el atacante luego descarga.
const puppeteer = require('puppeteer');
app.post('/invoice', async (req, res) => {
const { customerName, items } = req.body;
const html = `<h1>Invoice for ${customerName}</h1>
<ul>${items.map(i => `<li>${i}</li>`).join('')}</ul>`;
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(html);
const pdf = await page.pdf();
res.send(pdf);
});const puppeteer = require('puppeteer');
const DOMPurify = require('isomorphic-dompurify');
app.post('/invoice', async (req, res) => {
const name = DOMPurify.sanitize(req.body.customerName);
const items = req.body.items.map(i => DOMPurify.sanitize(i));
const html = `<h1>Invoice for ${name}</h1>
<ul>${items.map(i => `<li>${i}</li>`).join('')}</ul>`;
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setJavaScriptEnabled(false);
await page.setContent(html);
const pdf = await page.pdf();
res.send(pdf);
});Ejemplo Real
En 2022, investigadores demostraron ataques SSRF a traves de generacion de PDF en multiples plataformas SaaS. Al inyectar HTML como <iframe src='http://169.254.169.254/latest/meta-data/'>, accedieron a endpoints de metadatos de AWS y extrajeron credenciales IAM de facturas y reportes en PDF.
Cómo Prevenirlo
- Sanitiza todo el input del usuario con DOMPurify antes de insertarlo en templates HTML
- Deshabilita la ejecucion de JavaScript en el motor de renderizado de PDF
- Usa librerias de PDF solo-texto en vez de convertidores HTML-a-PDF cuando sea posible
- Bloquea el acceso a red del proceso de renderizado de PDF usando sandboxing
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Travesia de Ruta
highRutas de archivos construidas con input de usuario sin validar permiten a los atacantes leer o escribir archivos arbitrarios en el servidor usando secuencias ../.
Carga de Archivo sin Validacion
highAceptar cargas de archivos sin verificar tipo, tamano o contenido permite a los atacantes subir ejecutables maliciosos, web shells o archivos sobredimensionados que crashean el servidor.
SVG con JavaScript
mediumAceptar cargas de SVG sin sanitizacion permite a los atacantes embeber JavaScript en archivos SVG, habilitando ataques XSS cuando el SVG se renderiza en un navegador.
EXIF No Eliminado
lowImagenes servidas sin eliminar metadatos EXIF pueden filtrar coordenadas GPS, informacion del dispositivo, timestamps y otros datos sensibles de la persona que tomo la foto.