Dom Clobbering
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Grundlagen
Es ist möglich, globale Variablen im JS-Kontext mit den Attributen id
und name
in HTML-Tags zu generieren.
Nur bestimmte Elemente können das name-Attribut verwenden, um Globals zu clobbern, und zwar: embed
, form
, iframe
, image
, img
und object
.
Interessanterweise, wenn Sie ein Formular-Element verwenden, um eine Variable zu clobbern, erhalten Sie den toString
-Wert des Elements selbst: [object HTMLFormElement]
, aber bei Anker wird der toString
der Anker href
sein. Daher können Sie, wenn Sie mit dem a
-Tag clobbern, den Wert steuern, wenn er als Zeichenfolge behandelt wird:
Arrays & Attributes
Es ist auch möglich, ein Array und Objektattribute zu überschreiben:
Um ein 3. Attribut (z.B. x.y.z) zu überschreiben, müssen Sie ein form
verwenden:
Clobbering mehr Attribute ist komplizierter, aber immer noch möglich, unter Verwendung von iframes:
Das style-Tag wird verwendet, um genug Zeit für das Rendern des iframes zu geben. Ohne es erhalten Sie eine Warnung von undefined.
Um tiefere Attribute zu überschreiben, können Sie iframes mit HTML-Codierung auf diese Weise verwenden:
Filter Bypassing
Wenn ein Filter durch die Eigenschaften eines Knotens mit etwas wie document.getElementByID('x').attributes
schleift, könntest du das Attribut .attributes
überschreiben und den Filter unterbrechen. Andere DOM-Eigenschaften wie tagName
, nodeName
oder parentNode
und mehr sind ebenfalls überschreibbar.
Clobbering window.someObject
window.someObject
In JavaScript ist es üblich, Folgendes zu finden:
Das Manipulieren von HTML auf der Seite ermöglicht das Überschreiben von someObject
mit einem DOM-Knoten, was potenziell Sicherheitsanfälligkeiten einführt. Zum Beispiel können Sie someObject
durch ein Ankerelement ersetzen, das auf ein bösartiges Skript verweist:
In einem anfälligen Code wie:
Diese Methode nutzt die Skriptquelle aus, um unerwünschten Code auszuführen.
Trick: DOMPurify
erlaubt es, das cid:
-Protokoll zu verwenden, das doppelte Anführungszeichen nicht URL-kodiert. Das bedeutet, dass Sie ein kodiertes doppeltes Anführungszeichen injizieren können, das zur Laufzeit dekodiert wird. Daher wird das Injizieren von etwas wie <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
dazu führen, dass das HTML-kodierte "
zur Laufzeit dekodiert wird und aus dem Attributwert entkommt, um das onerror
-Ereignis zu erzeugen.
Eine andere Technik verwendet ein form
-Element. Bestimmte clientseitige Bibliotheken überprüfen die Attribute eines neu erstellten Formularelements, um sie zu bereinigen. Durch das Hinzufügen eines input
mit id=attributes
innerhalb des Formulars überschreiben Sie jedoch effektiv die Eigenschaften der Attribute, wodurch der Sanitizer daran gehindert wird, auf die tatsächlichen Attribute zuzugreifen.
Sie können ein Beispiel für diese Art von Clobbering in diesem CTF-Bericht finden.
Clobbering des Dokumentobjekts
Laut der Dokumentation ist es möglich, Attribute des Dokumentobjekts mithilfe von DOM Clobbering zu überschreiben:
Die Document Schnittstelle unterstützt benannte Eigenschaften. Die unterstützten Eigenschaftsnamen eines Document Objekts bestehen zu jedem Zeitpunkt aus den folgenden, in Baumreihenfolge entsprechend dem Element, das sie beigetragen hat, wobei spätere Duplikate ignoriert werden, und mit Werten aus id Attributen, die vor Werten aus Namensattributen kommen, wenn dasselbe Element beide beiträgt:
- Der Wert des Namensinhaltsattributs für alle exponierten embed, form, iframe, img und exponierten object Elemente, die ein nicht leeres Namensinhaltattribut haben und sich in einem Dokumentbaum mit dem Dokument als ihrem Wurzel befinden; - Der Wert des id Inhaltsattributs für alle exponierten object Elemente, die ein nicht leeres id Inhaltsattribut haben und sich in einem Dokumentbaum mit dem Dokument als ihrem Wurzel befinden; - Der Wert des id Inhaltsattributs für alle img Elemente, die sowohl ein nicht leeres id Inhaltsattribut als auch ein nicht leeres Namensinhaltattribut haben und sich in einem Dokumentbaum mit dem Dokument als ihrem Wurzel befinden.
Mit dieser Technik können Sie häufig verwendete Werte wie document.cookie
, document.body
, document.children
und sogar Methoden in der Document-Schnittstelle wie document.querySelector
überschreiben.
Schreiben nach dem Element, das überschrieben wurde
Die Ergebnisse von Aufrufen von document.getElementById()
und document.querySelector()
können verändert werden, indem ein <html>
- oder <body>
-Tag mit einem identischen id-Attribut injiziert wird. So kann es gemacht werden:
Darüber hinaus kann durch den Einsatz von Stilen, um diese injizierten HTML/body-Tags zu verbergen, eine Beeinträchtigung durch anderen Text im innerText
verhindert werden, wodurch die Wirksamkeit des Angriffs erhöht wird:
Untersuchungen zu SVG haben ergeben, dass ein <body>
-Tag ebenfalls effektiv genutzt werden kann:
Um das HTML-Tag innerhalb von SVG in Browsern wie Chrome und Firefox zu verwenden, ist ein <foreignobject>
-Tag erforderlich:
Clobbering Forms
Es ist möglich, neue Einträge in ein Formular hinzuzufügen, indem man einfach das form
-Attribut innerhalb einiger Tags angibt. Man kann dies verwenden, um neue Werte in ein Formular hinzuzufügen und sogar einen neuen Button hinzuzufügen, um ihn zu senden (Clickjacking oder Missbrauch von etwas .click()
JS-Code):
Für weitere Formularattribute in Button überprüfen Sie dies.
Referenzen
Heyes, Gareth. JavaScript für Hacker: Lernen Sie, wie ein Hacker zu denken.
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated