Shikata Ga Nai

Private? There is no such things.

Clobbering DOM attributes to bypass HTML filtersをやってみた

Hello there, ('ω')ノ

 

HTMLフィルタをバイパスするためのDOM属性のクロバリングを。

DOMクロバリングに対して脆弱なHTMLJanitorライブラリを使用しているらしく。

フィルタをバイパスして。

DOMクロバリングを使用してdocument.cookieにalertベクタを挿入しなさいと。

ちなみにFirefoxでは機能しないのでChromeがお勧めらしく。

 

まずは、コメント投稿ページでHTMLJanitorを確認して。

 

f:id:ThisIsOne:20210412140240p:plain

 

HTMLJanitorは最初に初期化され、初期化のタグと属性のみを使用できて。

 

f:id:ThisIsOne:20210412153823p:plain

 

document.implementation.createHTMLDocumentで。

サンドボックスとして使用する新しいHTMLドキュメントを作成してから。

サンドボックス内の要素に対して_sanitizeフィルタリングを実行して。

 

f:id:ThisIsOne:20210412154423p:plain

 

_sanitize関数の開始時に、createTreeWalker関数が呼び出されて。

TreeWalkerが作成されて。

このクラスは、現在のドキュメントのサブツリー内のすべてのノードと。

その位置を表して。

こんな感じで、処理の流れを理解する必要があって。

説明を書いていくとあまりにも時間がかかってしまうので、またの機会にと。

 

f:id:ThisIsOne:20210412154737p:plain

 

さっそく、下記のコメントを投稿するものの。

 <form id=x tabindex=0 onfocus=alert(document.cookie)><input id=attributes>

 

f:id:ThisIsOne:20210412135019p:plain

 

入力エリアは表示されるものの何も機能せず。

ちなみにURLは、下記のとおりで。

 https://acff1f421ebf83ef80d02d2f00e4001f.web-security-academy.net/post?postId=6

 

f:id:ThisIsOne:20210412135103p:plain

 

エクスプロイトサーバに下記を挿入して。

 <iframe src=https://acff1f421ebf83ef80d02d2f00e4001f.web-security-academy.net/post?postId=6 onload="setTimeout(someArgument=>this.src=this.src+'#x',500)">

 

コメントする前に完了する必要があるので、遅延操作が必要で。

簡単なのは、setTimeoutにiframeを使用することで

 

まずは、iframeが読み込まれるとJavaScriptが実行される前に。

コメントがロードされていることを確認するために遅延が必要なので。

500msの遅延させていて。

500msは、使用しているネットワーク条件に応じて適切に調整する必要があって。

 

Storeして、Deliverするとクリアできた。

 

f:id:ThisIsOne:20210412135414p:plain

 

View exploitすると。

ブラウザは、コメント内に作成したフォームのID「x」の要素にフォーカスして。

onfocusイベントハンドラーで、alert()ペイロードが実行されて。

 

f:id:ThisIsOne:20210412135759p:plain


Best regards, (^^ゞ