A Beautiful Bug: Interesting URL scheme bypass + Race Condition. から学ぶ

ソース:

medium.com

脆弱性XSS

 

訳:

アプリケーションコンテキスト

バグを説明する前に、私は常にアプリケーションの機能とバグの背景について説明し。

このアプリケーションを使用すると、ユーザーは画像、データ、またはグラフィックを使用してダッシュボードを作成でき、カスタム CSS を作成することもできて。

ダッシュボードごとに特別なアクセス トークンを作成し、それぞれに異なる権限や有効期限を設定できて。例:

  • TokenA = xxxxxxxxxxxxxx (Dashboard1 でのみ表示)
  • トークンB = xxxxxxxxxxxxxx (ダッシュボード2の編集)

このトークンは、ダッシュボードを他のユーザーと共有するために URL で使用され。

共有するURL → /dashboard1?token=xxxxxxxxxxxxxxx-> これにより、誰でもダッシュボードを閲覧できるようになり

この機能の興味深い点は、トークンの有効期限が切れると、ダッシュボードの JavaScript コードが、ダッシュボード所有者が以前に指定した URL にユーザーをリダイレクトすることで。

流れは次のようになり。

 

 

  • User1 が ダッシュボードを作成 → ID=12345 および有効期限 URL= https://website.com
  • User1 は 表示権限を持つトークンを作成します。有効期限は 2 分です
  • User1 が URL を作成し、 User2に送信します。 https://redacted.com/dashboard/12345?token=xxxxxxxxxxxx
  • ユーザー 2 は URL を開いて、ダッシュボードを 2 分間表示して分析します。
  • トークの有効期限が切れると、ダッシュボードが User2 を次の場所にリダイレクトします。 https://website.com これは、新しいトークンを再認証して作成するために使用されます。

攻撃のアイデア

リダイレクト機能は、次のような Javascript コードを使用してクライアント側で処理され。

 

window.onTokenExpiry() = expiryUrl => {

window.location = expiryUrl; //When token expires, redirect to the provided URL

}

 

クライアント側のオープンリダイレクトでは、考えられる固有の攻撃は XSS によるもので。 javascript: (他の既存の攻撃を教えてください)。

クライアント側で URL サニタイズがなかったので、私自身のダッシュボードの expiryUrl を次のように更新し。 javascript:alert(1)

 

ダッシュボードの編集リクエスト:

 

レスポンス:

 

予想通り、サーバー側にブロックする正規表現がいくつかあります。 javascript: URL。

興味深いバイパスと XSS

このような種類の URL 正規表現をバイパスするには、この図で URL 部分を学習することをお勧めし。

パスのみを使用してみました /path123 、パスなし path123相対パス付き path123/path111、そしてすべてがうまくいき。
一般的なバイパスを使用して、さまざまなプロトコルの URL を使用してみましたが、 https:// そして http:// 働き。

おそらく、サーバーは、指定された URLがパスであるか完全な URL であるかをチェックし、完全な URLで無効なプロトコルが含まれている場合は無効にし。

これを悪用したい場合は、URL が次で始まる必要があります。 javascript: 必須なので使ってみました javascript:hello@hello.com そしてそれはうまくいき。

おそらくアプリケーションは次のことを想定しています http:// プロトコルを検出すると、 @ 性格、なぜなら @ にのみ存在します http:// URL の一部として。

次に、次の内容を含む有効な JS コードを記述する必要があり。 @
私は試した javascript:code//hello@hello.com 、とコメントしています。 @コードに影響を与えないように、無効な URL を返し。
このようなことが起こるのはなぜだと思いますか / 前です @ 、サーバーは次のように考えます @ はパスの一部であり、同じ無効な URL エラーを返し。

最後に、私が使用したのは、 javascript:code%2f%2fhello@hello.com URLコーディング /そしてそれはうまくいきました!!

有効なペイロードがありますが、それを使用する必要があります。

悪用

要約すると、次へのリダイレクトを持つダッシュボードを作成できます。 javascript:...

問題は、リダイレクトがトークンの有効期限が切れたときにのみ発生し、被害者がいつリンクをクリックするかわからないことで。

なぜ期限切れのトークンを URL に直接追加しないのかと疑問に思われるかもしれません。
サーバー側でトークンが無効であると検出され、ページが読み込まれないため、これは機能しません。
有効なトークンを作成し、そのトークンを使用してダッシュボードへのリンクを作成し、被害者がページを読み込んだときに正確にトークンを期限切れにする必要があり。

アプリケーションを深く知っていることの利点により、解決策を非常に迅速に見つけることができて。

作成されたトークンは API エンドポイントを使用して削除できます /token/TokenID DELETE リクエストを使用し。

ダッシュボードはカスタム CSS を使用できるため、自分のサーバーのリソースをロードする CSS コードを使用し。
サーバーが嘆願書を取得すると、ダッシュボード セッションで使用されているトークンがすぐに削除され、ダッシュボードは被害者を javascript: ペイロード

 

探索手順:

 

 

  • 以下を使用してダッシュボードを作成します。
    有効期限URL → javascript:alert(document.cookie)%2f%2fhello@hello.com
    CSSコード→ @import url("https://attackerserver.com/csscallback")
  • 表示権限を持つトークンを作成→xxxxxxxxxxxx。
  • URL を作成して、すべてのユーザーがダッシュボードをロードできるようにします。 URL→ https://redacted.com/dashboard/12345?token=xxxxxxxxxxxx
  • ユーザーがリンクをクリックすると、ダッシュボードが完全にロードされます。
  • ページ上のカスタム CSS が読み込まれます https://attackerserver.com/csscallback
  • 攻撃者のページは請願を受け取り、すぐにトークン xxxxxxxxxx を削除します。
  • トークンが無効であるため、ダッシュボード JS は被害者を次の場所にリダイレクトします。 javascript:payload XSS をトリガーし、セッション Cookie を攻撃者に送信します。
  • 攻撃者は被害者のアカウントを所有します。

 

ほなほな。