Shikata Ga Nai

Private? There is no such things.

DOM XSS Walkthroughを訳してみた

Hello there, ('ω')ノ

 

DOM XSSのウォークスルーを。

 

脆弱性:

 DOM XSS

 

記事:

 https://medium.com/@youssefla/dom-xss-walkthrough-4d60c45ffb21

 

JavaScriptコードをWebページに実行できる場合は、XSSがあって。

XSSには、基本的に3つのタイプがあって。

reflected、stored、DOMベースで。

今回は、DOMベースのタイプについて。


DOMベース XSSとはクライアント側の脆弱性で。

JavaScriptコードがソースを取得し、シンク(実行関数)で。

実行されるような方法でソースを誤って処理した場合に発生して。

下記を例に見てみると。

 

<html>
 <head>
  <title>dom xss example</title>
 </head>
 <body>
  <script>
   var x = document.location.hash.substr(1);
   window.location=x;
  </script>
</body>
</html>

 

上記のコードを使用しているhtmlページがあるとすると。

基本的に、URLのハッシュ(#)の後にある文字を取得して。

それを使用して、window.locationを使用してユーザをURLにリダイレクトして。

攻撃者がハッシュ(#)の後にjavascript:alert(1)を指定すると。

DOM XSSの脆弱性の証拠としてalert:alert(1)関数が実行されて。

したがって、エクスプロイトは次のようになって。

 http://victim/domxss.html#javascript:alert(1)

 

ソースとシンクの概念:

DOM XSSの脆弱性を探すときに、注目すべき2つの主な点があって。

それが、ソースとシンクで。

ソースは、信頼できないデータがアプリケーションによって取得される場所で。

これは、ユーザ入力によって制御できて。

信頼できないソースが実際に実行されている場所であるシンクに渡されるので。

DOM XSSの脆弱性を見つけることは。

ソースをシンクに渡す方法を見つけることで。

 

javascriptとの通信するときのソースには、主に4つのカテゴリがあって。

 URLベースのソース:

  document.url、document.location.hash


 ナビゲーションベースのソース:

  document.referer、window.name


 コミュニケーションソース:

  ajax、websockets、webmessaging


 ストレージソース:

  cookies、localstorage、session storage

 

そして、シンクの4つの主要なカテゴリがあって。

  javascriptの実行は次のようにシンクして:

  val(payload)、setTimout(payload,100)、<div onclick=”payload”>


 HTMLの実行は次のようにシンクして:

  htmlElement.innerHTML=payload、document.write(payload)


 javascript URIは次のようにシンクして:

  document.location=payload、location.href=payload


 動作変更に対するHTMLの変更:

   (element).src、(element).href (in certain elements)

 

DOM XSSの例:

下記がデモンストレーションのサイトで。

 https://public-firing-range.appspot.com/

 

f:id:ThisIsOne:20211218063931p:plain

 

 https://public-firing-range.appspot.com/dom/toxicdom/postMessage/complexMessageDocumentWriteEval

 

f:id:ThisIsOne:20211218071903p:plain

 

この単純なHTMLページをブラウザで開くと、コンテンツはレンダリングされず。

内容から何も表示されないものの。

ソースコードを見ると、物事ははるかに興味深いもので。

 

f:id:ThisIsOne:20211218063824p:plain

 

JSON形式のメッセージで、msg.data.actionの値をチェックして。

「exec」と等しい場合は、関数eval(msg.data.payload)を。

実行するpostMessage()イベントリスナーがあるようなので。

ブラウザのデベロッパーツールのコンソールタブを開き、次のことを試すと。

 window.postMessage({"action":"exec","payload":"alert(document.domain)"},"*")

 

下記のように提供したjavascriptコードが実行されて。

 

f:id:ThisIsOne:20211218072906p:plain

 

したがって、この脆弱性を悪用するためにやらなければならないのは。

次のコードを含む悪意のあるHTMLページを公開することだけで。

 

<iframe onload="send()" id="f" src="https://public-firing-range.appspot.com/dom/toxicdom/postMessage/complexMessageDocumentWriteEval"></iframe>
<script>
 function send(){
  var x = {"action":"exec","payload":"alert(document.domain)"}
  document.getElementById('f').contentWindow.postMessage(x,"*");
 }
</script>
Bad sender

 

このページにアクセスすると、XSSの証拠として。

document.domain値を含むアラートボックスが表示されて。


DOM XSSの脆弱性の実際の例:

ターゲットで偵察を行っているときに。

簡単なリンクを示す簡単なhtmlページに出くわして。

ソースコードを調べたところ、次のことがわかって。

 

f:id:ThisIsOne:20211218063638p:plain

 

javascriptは「url」パラメータを期待しているようなので。

その値を取得し、事前定義された値と一致するかどうかを確認して。

一致しない場合は、「a」タグの「href」属性に下記のように値が含まれて。

 javascript:window.open(‘“+newurl+”’)

 

リンクをクリックすると、ブラウザは提供された「url」値を。

含む新しいウィンドウタブを開くので、下記を追加するだけで。

 url=javascript:alert(document.domain)

 

そして、エクスプロイトは下記のようになって。

 https://victim.com/vulnerable.html?url=javascript:alert(1

 

最後にそのリンクをクリックすると、入力したJavaScriptコードが実行されて。

 

Best regards, (^^ゞ