ブラウザのストレージの値を変更する【CTF】

Webサイトで一時的なデータを管理する際に利用されるストレージとして、SessionStorageやLocalStorageがありますが、今回はその値を変更してみます。
クライアントが保持するデータは如何に簡単に操作する事ができるのか、どのような危険が潜んでいるのか、実際にCELTFで攻撃して体験します。

注: CELTF の "ToDo管理サービス" に関する解析方法を含みます。

ブラウザのストレージ

ブラウザのストレージとして、主にSessionStorageとLocalStorageがあります。
SessionStorageは新しいタブや新しいウィンドウなどのセッション単位で保存され、LocalStorageは削除しない限りブラウザに永続的に保存される違いがあります。
使用用途の違いとして、SessionStorageはセッション情報など一時的な情報を保存し、LocalStorageはキャッシュなど非センシティブな情報を保存するのに使用されます。
ブラウザのストレージはXSS攻撃に対して脆弱なため、センシティブな情報を保存する場合は有効期限が短いトークン情報に限るなどの工夫が必要になります。

実際に書き換える

今回はChromeを利用し、CELTFのToDo管理サービスで実際に書き換えを行ってみます。

ToDo管理サービスのログイン後のページを表示する

まず、ストレージの値を書き換えるためにCELTFのToDo管理サービスのログインします。
ログインに関してわからない場合、 APIとの通信内容を実際に見て内容を理解する を参考にしてみてください。

デバッグ画面を開く

ログイン後の画面を開けたら、デバッグ画面を開きます。
デバッグ画面を開いたあと、 "Application" タブを開き "SessionStorage" からドメイン名を選択します。

書き換える値を取得する

項目にKey, Valueが表示されていると思いますが、今回は "celtf" の値を書き換えるため、"celtf" の行を選択します。
選択後、Valueの値をダブルクリックする事で編集モードに切り替えられるため、編集モードにして値をコピーします。

値を書き換える

値がコピーできたら、任意のエディタに貼り付けを行い値を書き換えます。
今回は、"userId" を他の値に書き換える事で、自分の認証トークンを利用して他のユーザのデータにアクセスを試みます。

  • 元のデータ
{"basicToken":"******","userId":1}
  • 修正後のデータ
{"basicToken":"******","userId":2}

修正後、SessionStorageから値を上書きします。

画面を更新して反映させる

値の書き換えが完了後、画面を更新して反映します。
正常に書き換えが完了している場合、更新後 "userId" が "2" のメモ/ToDoリストが表示されます。
再度SessionStorageの "celtf" を選択した際、値の画面の "userId" が "2" に変更されていれば成功です。

メモ/ToDoリストに表示されている "認証トークンの発行" の値が今回のフラグとなります。

おわりに

今回はブラウザのデバッグモードを利用してSessionStorageを書き換えてみました。
今回のフラグはデバッグモードのNetworkからリクエストをコピーし、実際のリクエストを変更してコンソールなどでAPIを叩く事でもフラグは取得できますが、ブラウザの機能だけでも充分に攻撃が可能な事を見るためストレージを書き換える方法で実践しました。
Webサービスを開発する際は、クライアントから送られてくる情報は書き換えられる事、クライアントに保存する値は誰でも見れる状態にある、という事を意識していきたいです。