mediumCWE-79A03:2021

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.

Código Vulnerable
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);
});
Código Seguro
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

Node.jsPythonJavaPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas