Dom Clobbering
基本
HTMLタグの属性**id
とname
**を使用して、JSコンテキスト内にグローバル変数を生成することが可能です。
のみ 特定の要素は name属性 を使用してグローバルをクラッシャーできます。それらは: embed
, form
, iframe
, image
, img
および object
です。
興味深いことに、form要素 を使用して変数を クラッシャー にすると、要素自体の toString
値が得られます: [object HTMLFormElement]
ですが、anchor の場合、toString
はアンカーの href
になります。したがって、a
タグを使用してクラッシャーを行うと、文字列として扱われる ときに 値 を 制御 できます:
配列と属性
配列とオブジェクトの属性をクラッシャーすることも可能です:
3番目の属性(例:x.y.z)を上書きするには、**form
**を使用する必要があります:
属性をさらにクラッキングすることはより複雑ですが、それでも可能です。iframeを使用します:
styleタグはiframeがレンダリングされるのに十分な時間を与えるために使用されます。これがないと、undefinedのアラートが表示されます。
より深い属性をクラッシャーするには、htmlエンコーディングを使用したiframesを次のように使用できます:
フィルターバイパス
フィルターが document.getElementByID('x').attributes
のようなものでノードの プロパティ を ループ している場合、属性 .attributes
を クラッシャー してフィルターを 壊す ことができます。 tagName
、 nodeName
、 parentNode
などの他のDOMプロパティも クラッシャブル です。
window.someObject
のクラッバーリング
window.someObject
のクラッバーリングJavaScriptでは、次のようなものを見つけることが一般的です:
HTMLをページ上で操作することで、someObject
をDOMノードで上書きすることができ、潜在的にセキュリティの脆弱性を引き起こす可能性があります。例えば、someObject
を悪意のあるスクリプトを指すアンカー要素に置き換えることができます:
脆弱なコードの例としては:
この方法は、スクリプトソースを利用して不要なコードを実行します。
トリック: DOMPurify
は cid:
プロトコルを使用することを許可しており、二重引用符をURLエンコードしません。これは、実行時にデコードされるエンコードされた二重引用符を注入できることを意味します。したがって、<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
のようなものを注入すると、HTMLエンコードされた "
が 実行時にデコードされ、属性値から エスケープ されて onerror
イベントを 作成 します。
別の技術は form
要素を使用します。特定のクライアントサイドライブラリは、新しく作成されたフォーム要素の属性を検査してクリーンアップします。しかし、フォーム内に id=attributes
の input
を追加することで、属性プロパティを効果的に上書きし、サニタイザーが実際の属性にアクセスできないようにします。
このタイプのクラッキングの例をこのCTFの解説で見つけることができます。
ドキュメントオブジェクトのクラッキング
ドキュメントによると、DOMクラッキングを使用してドキュメントオブジェクトの属性を上書きすることが可能です:
Document インターフェースは named properties をサポートしています。Document オブジェクトの supported property names は、次のもので構成されます。tree order に従い、後の重複を無視し、同じ要素が両方を提供する場合は、id 属性からの値が名前属性からの値の前に来ます:
- 空でない名前コンテンツ属性を持ち、ドキュメントを root とする document tree にあるすべての exposed embed、form、iframe、img、および exposed object 要素の名前コンテンツ属性の値; - 空でない id コンテンツ属性を持ち、ドキュメントを root とする document tree にあるすべての exposed object 要素の id コンテンツ属性の値; - 空でない id コンテンツ属性と空でない名前コンテンツ属性の両方を持ち、ドキュメントを root とする document tree にあるすべての img 要素の id コンテンツ属性の値。
この技術を使用すると、一般的に使用される document.cookie
、document.body
、document.children
などの 値を上書き したり、document.querySelector
のような Document インターフェース内のメソッドを上書きしたりできます。
要素がクラッシャーされた後の書き込み
document.getElementById()
と document.querySelector()
への呼び出しの結果は、同じ id 属性を持つ <html>
または <body>
タグを注入することで変更できます。これを行う方法は次のとおりです:
さらに、これらの注入されたHTML/bodyタグを隠すためにスタイルを使用することで、innerText
内の他のテキストからの干渉を防ぎ、攻撃の効果を高めることができます:
SVGに関する調査では、<body>
タグも効果的に利用できることが明らかになりました:
SVG内でHTMLタグがChromeやFirefoxなどのブラウザで機能するためには、<foreignobject>
タグが必要です:
Clobbering Forms
フォーム内に新しいエントリを追加することは、いくつかのタグ内にform
属性を指定するだけで可能です。これを使用して、フォーム内に新しい値を追加したり、新しいボタンを追加して送信することもできます(クリックジャッキングや一部の.click()
JSコードの悪用):
フォーム属性の詳細についてはボタンを確認してください。
参考文献
Heyes, Gareth. ハッカーのためのJavaScript: ハッカーのように考えることを学ぶ。
Last updated