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/
https://public-firing-range.appspot.com/dom/toxicdom/postMessage/complexMessageDocumentWriteEval
この単純なHTMLページをブラウザで開くと、コンテンツはレンダリングされず。
内容から何も表示されないものの。
ソースコードを見ると、物事ははるかに興味深いもので。
JSON形式のメッセージで、msg.data.actionの値をチェックして。
「exec」と等しい場合は、関数eval(msg.data.payload)を。
実行するpostMessage()イベントリスナーがあるようなので。
ブラウザのデベロッパーツールのコンソールタブを開き、次のことを試すと。
下記のように提供したjavascriptコードが実行されて。
したがって、この脆弱性を悪用するためにやらなければならないのは。
次のコードを含む悪意のある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ページに出くわして。
ソースコードを調べたところ、次のことがわかって。
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, (^^ゞ