XSSの次は、Client-State Manipulation。攻撃者は、Webアプリケーションに対し、任意のリクエストを生成して送りつけることができる。クライアント側で悪意のあるリクエストを生成し、それを送りつけて脆弱性を突く方法を、Client-State Manipulationと呼んでいるようだ。
問題1. Elevation of Privilege
調査
1問目は「Convert your account to an administrator account.」。自分のユーザー権限を、administrator権限にすることができればOK。ちなみに、問題のアイコンが白いチーズになっている。これは、jarlsbergのソースコードを調査しないと解けないということ。このような状況は、オープンソースなどでは一般的。攻撃者は、公開されているソースコードを調査した上で、脆弱性を突くことができる。
まずは、administrator権限を扱っている箇所をソースコードで探してみる。すると、ログイン時に呼び出される_CreateCookieというメソッドで、administratorかどうかのフラグをcookieにセットしていることがわかった。
if uid is None: return (self.NULL_COOKIE, cookie_name + '=; path=/') database = self._GetDatabase() profile = database[uid] if profile.get('is_author', False): is_author = 'author' else: is_author = '' if profile.get('is_admin', False): is_admin = 'admin' #DBのprofileをチェックし、adminの場合は'admin'をセット else: is_admin = '' c = {COOKIE_UID: uid, COOKIE_ADMIN: is_admin, COOKIE_AUTHOR: is_author} c_data = '%s|%s|%s' % (uid, is_admin, is_author) #adminの場合、2番目の%sは'admin'となる # global cookie_secret; only use positive hash values h_data = str(hash(cookie_secret + c_data) & 0x7FFFFFF) c_text = '%s=%s|%s; path=/' % (cookie_name, h_data, c_data) return (c, c_text)
ログイン後の自分のcookie内容は以下のとおり。
108142339|golem-xiv||author
“admin”という文字列を追加して、以下のようにしてやればよさそうだ。*1
108142339|golem-xiv|admin|author
ログイン後、cookieを書き換えて、画面をリロード。あれ?admin権限になっていないようだ。admin権限の場合、画面上部のメニューに、サーバーの管理メニューが表示されるはず。
ソースコードをもう一度確認すると、先頭の数値(108142339)は、それ以降の文字列(golem-xiv||author)のハッシュ値となっている。つまり、文字列を変更した場合は、ハッシュ値も再計算してやらなければならないようだ。ハッシュ値の計算式は以下のとおり。cookie_secretの値は、jerlsbergのインストールフォルダにあるsecret.txtの中身(Cookie!\n!)がセットされている。
h_data = str(hash(cookie_secret + c_data) & 0x7FFFFFF)
脆弱性の確認
上記の計算式にしたがって、”golem-xiv|admin|author”のハッシュ値を計算すると、”4371089″になる。よって、ログイン後、cookieの内容を”4371089|golem-xiv|admin|author”に書き換えて、画面をリロード。管理者用のメニューが表示されることを確認した。
対策
攻撃者が自由に変更できるcookieの内容を、(認証もなく)そのまま信用して処理をしてしまっていることが問題。認証処理はサーバーサイドで実施しなければならない。ログイン後、cookieではなく、サーバーサイドのセッションにadminフラグを持つようにすればよい。
補足
上記の脆弱性は、次の「Cookie Manipulation」の問題の回答であったようだ。サイトに記載されているもう一方の脆弱性は、jerlsbergのサイトを参照のこと。
*1:cookieの書き換えには、CS Lite https://addons.mozilla.org/ja/firefox/addon/5207/を使いました。便利ですね。