Client-State Manipulation (その1)

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”に書き換えて、画面をリロード。管理者用のメニューが表示されることを確認した。

f:id:GOLEM-XIV:20100620005810p:image

対策

攻撃者が自由に変更できるcookieの内容を、(認証もなく)そのまま信用して処理をしてしまっていることが問題。認証処理はサーバーサイドで実施しなければならない。ログイン後、cookieではなく、サーバーサイドのセッションにadminフラグを持つようにすればよい。

補足

上記の脆弱性は、次の「Cookie Manipulation」の問題の回答であったようだ。サイトに記載されているもう一方の脆弱性は、jerlsbergのサイトを参照のこと。

*1:cookieの書き換えには、CS Lite https://addons.mozilla.org/ja/firefox/addon/5207/を使いました。便利ですね。

コメントを残す

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