Client-State Manipulation (その3)

久しぶりに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のように、クロスドメインでのサービス提供のためにスクリプト埋め込みを用いる場合は、そもそも不必要な機密情報を含まないようにすることが大事。

コメントを残す

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