Dom Clobbering
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 globale Variablen zu überschreiben. Diese sind: embed
, form
, iframe
, image
, img
und object
.
Interessanterweise erhält man, wenn man ein Formularelement verwendet, um eine Variable zu überschreiben, den toString
-Wert des Elements selbst: [object HTMLFormElement]
, aber mit dem Anker ist der toString
der Anker-href. Daher kann man, wenn man das a
-Tag verwendet, die Wert kontrollieren, wenn es als Zeichenkette behandelt wird:
Arrays & Attribute
Es ist auch möglich, ein Array und Objektattribute zu überschreiben:
Um ein drittes Attribut (z. B. x.y.z) zu überschreiben, müssen Sie ein form
verwenden:
Das Überschreiben weiterer Attribute ist komplizierter, aber immer noch möglich, indem man iframes verwendet:
Der style-Tag wird verwendet, um dem iframe genügend Zeit zum Rendern zu geben. Ohne ihn erhalten Sie eine Warnung für "undefined".
Um tiefere Attribute zu überschreiben, können Sie iframes mit HTML-Codierung verwenden, wie folgt:
Filterumgehung
Wenn ein Filter die Eigenschaften eines Knotens mit etwas wie document.getElementByID('x').attributes
durchläuft, könnten Sie das Attribut .attributes
überschreiben und den Filter außer Kraft setzen. Andere DOM-Eigenschaften wie tagName
, nodeName
oder parentNode
und mehr sind ebenfalls überschreibbar.
Überschreiben von window.someObject
window.someObject
In JavaScript ist es üblich, Folgendes zu finden:
Die Manipulation von HTML auf der Seite ermöglicht das Überschreiben von someObject
mit einem DOM-Knoten und kann potenziell Sicherheitslücken verursachen. Zum Beispiel können Sie someObject
durch ein Anker-Element 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
ermöglicht die Verwendung des Protokolls cid:
, das Anführungszeichen nicht URL-codiert. Dies bedeutet, dass Sie ein codiertes Anführungszeichen injizieren können, das zur Laufzeit decodiert wird. Daher führt das Injizieren von etwas wie <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
dazu, dass das HTML-codierte "
zur Laufzeit decodiert wird und aus dem Attributwert entkommt, um das Ereignis onerror
zu erzeugen.
Eine andere Technik verwendet ein form
-Element. Bestimmte clientseitige Bibliotheken überprüfen die Attribute eines neu erstellten Formulars, um sie zu bereinigen. Durch Hinzufügen eines input
mit id=attributes
innerhalb des Formulars überschreiben Sie effektiv das Attribut attributes
und verhindern, dass der Sanitizer auf die tatsächlichen Attribute zugreift.
Sie können ein Beispiel für diese Art von Clobbering in diesem CTF-Writeup finden.
Überschreiben des Dokumentobjekts
Gemäß der Dokumentation ist es möglich, Attribute des Dokumentobjekts mit DOM Clobbering zu überschreiben:
Das Document-Interface 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 Werte von id-Attributen vor Werten von name-Attributen stehen, wenn dasselbe Element sowohl das eine als auch das andere beiträgt:
- Der Wert des name-Inhaltsattributs für alle exposed embed-, form-, iframe-, img- und exposed object-Elemente, die ein nicht leeres name-Inhaltsattribut haben und sich in einem Dokumentbaum mit dem Dokument als Wurzel befinden; - Der Wert des id-Inhaltsattributs für alle exposed object-Elemente, die ein nicht leeres id-Inhaltsattribut haben und sich in einem Dokumentbaum mit dem Dokument als Wurzel befinden; - Der Wert des id-Inhaltsattributs für alle img-Elemente, die sowohl ein nicht leeres id-Inhaltsattribut als auch ein nicht leeres name-Inhaltsattribut haben und sich in einem Dokumentbaum mit dem Dokument als 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 überschriebenen Element
Die Ergebnisse von Aufrufen von document.getElementById()
und document.querySelector()
können durch das Einfügen eines <html>
- oder <body>
-Tags mit einem identischen id-Attribut verändert werden. So kann es gemacht werden:
Darüber hinaus kann durch die Verwendung von Stilen, um diese injizierten HTML-/Body-Tags zu verbergen, eine Beeinträchtigung durch anderen Text im innerText
verhindert werden, wodurch die Effektivität des Angriffs erhöht wird:
Untersuchungen zu SVG haben ergeben, dass ein <body>
-Tag ebenfalls effektiv genutzt werden kann:
Um das HTML-Tag in SVG in Browsern wie Chrome und Firefox zu verwenden, ist ein <foreignobject>
-Tag erforderlich:
Clobbering von Formularen
Es ist möglich, neue Einträge in einem Formular hinzuzufügen, indem man einfach das form
-Attribut in einigen Tags angibt. Dies kann verwendet werden, um neue Werte in einem Formular hinzuzufügen und sogar einen neuen Button zum Absenden hinzuzufügen (Clickjacking oder Missbrauch von .click()
JS-Code):
Weitere Formattribute finden Sie hier.
Referenzen
Heyes, Gareth. JavaScript für Hacker: Lernen Sie, wie ein Hacker zu denken.
Last updated