久しぶりにJarlsbergを再開。Client-State Manipulationの最後の問題。
ちなみに、アプリケーションの名前がJarlsbergからGruyereに変わっていました。なぜに…と思ったのですが、ここを見るに、すでにJarlsbergというtrademarkが存在していたためでしょうか。
問題4. Cross Site Script Inclusion (XSSI)
調査
4問目はCross Site Script Inclusion (XSSI) に関する問題。「Find a way to read someone else’s private snippet using XSSI.」とのこと。javascriptなどは、自ドメインのページに、外部ドメインのスクリプトをincludeすることができる。例えば、Google Maps APIを使うときは、Googleから提供されているjavascriptを自ドメインのページにincludeすることになる。includeされたスクリプトは、そのincludeされたドメインのコンテキストで動作する。これを利用して、他人のprivate snippetを参照する方法を見つけなさい、という問題。
ヒントに「feed.gtlを呼ぶとどうなる?」とあるので、呼んで見る。private snippetを持つユーザーでログインした状態で、feed.jtlにアクセスしてみると、以下のようなデータが返ってくる。確かに、自分のprivate snippetが格納されている。
_feed(( { "private_snippet": "This is private snippet." ,"cheddar": "Gruyere is the cheesiest application on the web." ,"brie": "Brie is the queen of the cheeses!!!" } ))
脆弱性の確認
次のようなHTMLを準備する。
<html> <body> <script> function _feed(obj){ alert(obj['private_snippet']); } </script> <script src="http://localhost/xxxxxxxx/feed.gtl"></script> </body> </html>
このHTMLをブラウザで開くと、”This is private snippet.”がダイアログに表示される。上記の例では、自分のprivate snippetが表示されただけである。しかしながら、もし悪意のあるユーザーが、自分のサイトにこのようなHTMLを仕掛けておき、他のJarlsbergユーザーに踏ませることができれば、そのユーザーのprivate snippetが取得されてしまうことになる。
対策
XSRFと同様、以下のような対策が考えられる。
- tokenを使用し、リクエストが正当であることを確認する
- Refererヘッダをチェックし、自ドメインからのアクセスであることを確認する
- scriptタグによる埋め込みを防ぐために、POSTリクエストのみを受け付ける
また、もしJSONPのように、クロスドメインでのサービス提供のためにスクリプト埋め込みを用いる場合は、そもそも不必要な機密情報を含まないようにすることが大事。