Las aplicaciones web con frecuencia generan documentos PDF al vuelo: facturas, informes, certificados. Para el usuario esto es cómodo, pero a veces en esos generadores se esconde una vulnerabilidad conocida como Inyección en PDF. La esencia es que un atacante puede insertar un fragmento de texto o código que modificará el contenido del PDF e incluso provocará una filtración de datos. El problema es poco conocido, pero las consecuencias pueden ser graves — desde la divulgación de información personal hasta la elusión de sistemas de autorización.
Qué es la inyección en PDF y por qué es peligrosa
La inyección en PDF es un tipo de ataque de inyección en el que la entrada del usuario se inserta directamente en un documento PDF sin el filtrado o escape adecuados. Si el generador de PDF utiliza texto de la petición o de la base de datos tal cual, un atacante puede introducir estructuras de control de PDF, scripts o marcas visibles para robar información.
El peligro es que el PDF no es simplemente «una imagen con texto». Es un formato complejo con su propio lenguaje de marcado, donde se puede:
- Crear campos de formulario ocultos.
- Incrustar JavaScript.
- Cambiar enlaces y metadatos.
- Insertar contenido externo.
Si el generador de documentos no valida la entrada, el atacante obtiene una herramienta para inyectar esos elementos directamente en el archivo.
Cómo funciona en la práctica
Imagine que un sitio genera un certificado con el nombre del usuario. En el código esto puede verse así:
$pdf->Write(10, "Certificado emitido: " . $_GET['name']);
Si en el parámetro name se coloca un nombre normal, todo será correcto. Pero un atacante puede enviar en su lugar un fragmento de sintaxis PDF, por ejemplo:
(Certificado emitido: ) /Author (admin) /Title (Confidential Report)
Como resultado, el PDF contendrá metadatos inesperados o incluso información oculta que el generador añadió automáticamente.
Ejemplo de fuga de datos
Algunas bibliotecas de PDF incluyen automáticamente en los metadatos el nombre del archivo de plantilla o su ruta. Mediante inyección se puede exponer esa información en la parte visible del documento o en las propiedades del archivo, lo que conducirá a una fuga de la estructura interna del servidor.
Dónde se encuentra con más frecuencia la inyección en PDF
La vulnerabilidad puede aparecer en cualquier sistema donde el PDF se genere de forma dinámica:
- Generadores en línea de facturas y recibos.
- Servicios de creación de certificados y diplomas.
- Sistemas de reservas y venta de entradas.
- CRM y ERP con función de exportación a PDF.
Son especialmente vulnerables los proyectos que usan bibliotecas ya hechas como TCPDF o FPDF pero no filtran la entrada del usuario.
Qué puede hacer un atacante
La inyección en PDF puede utilizarse para:
- Incrustar enlaces maliciosos — el usuario abrirá el PDF, hará clic en un enlace «inofensivo» y será dirigido a un sitio de phishing.
- Extraer datos ocultos — por ejemplo, ID de pedido, IP interna del servidor o incluso el contenido de una variable del plantilla.
- Manipular la apariencia — sustitución de textos, fechas, firmas.
- Incrustar JavaScript — aunque los lectores modernos suelen bloquear scripts peligrosos, versiones antiguas pueden ejecutarlos.
Por qué se habla menos de la inyección en PDF que de la inyección SQL
La inyección SQL o el XSS son conocidos porque afectan directamente al servidor y al navegador. La inyección en PDF se considera un problema «de nicho», aunque sus consecuencias pueden ser igualmente devastadoras. En algunos casos, a través de un PDF se puede eludir la autenticación de dos factores o lograr que el usuario envíe sus datos al servidor del atacante.
Cómo detectar la inyección en PDF
La comprobación de inyección en PDF incluye:
- Introducir caracteres de prueba (por ejemplo, paréntesis, barras) en los campos que acaben en el PDF.
- Analizar el PDF resultante con pdf-parser o PDFiD.
- Buscar objetos y metadatos inesperados.
- Probar en distintos lectores de PDF, ya que el comportamiento puede variar.
Cómo protegerse
Las medidas de protección son bastante simples, pero a menudo se ignoran:
- Escapar los caracteres especiales de PDF (
( ) / % [ ]). - Usar listas blancas de caracteres y formatos permitidos.
- Generar PDF solo a partir de plantillas preparadas, sin insertar texto directamente en el flujo de comandos.
- Actualizar regularmente las bibliotecas de generación de PDF.
Conclusión
La inyección en PDF recuerda que cualquier punto donde la entrada del usuario llegue a un documento o archivo puede convertirse en un vector de ataque. El formato PDF ofrece muchas posibilidades, y eso es precisamente lo que lo hace peligroso si los datos no se tratan correctamente. Incluya filtrado y escape en las prácticas habituales de desarrollo — así sus documentos PDF seguirán siendo simplemente PDF y no una herramienta de ataque.