引き続きJarlsbergの問題を解く。
問題3. Stored XSS
調査
3問目は「Now find a stored XSS. What we want to do is put a script in a place where Jarlsberg will serve it back to another user.」。他のユーザーが閲覧できるような場所に、攻撃用スクリプトを埋め込むことができるか。
まずは他のユーザーでの動作確認のため、golem-xiv以外にユーザーを作成することにする。「honest-annie」というユーザーを作る*1。
その後、golem-xivでログイン。スクリプトを埋め込める場所を探す。HomeのSnippetsに注目してみる。ほかのユーザーのコメントが表示されているらしい。
ということで、自分もSnippetsを作成してみる。その際に、cookieを表示するスクリプトを埋め込んでみる・・・ ん?コメントを見ると、使用できるタグに制限があるようだ。ということは、そのまま埋め込めなさそう。単純に埋め込むと、エスケープされてしまう。Snippetsの画面には、Homepageのリンクも表示されているので、問題2と同じ方法も使えるが、それも芸が無いなぁ。
タグのエスケープ処理が正しくないのでは?ということでいろいろ試してみる。
- 単純に scriptタグを使用すると、script→blockedと変換されるようだ。
- inputタグも、同様にblockedに変換される (inputのonclickを使用できないか、と考えたので。)
- aタグは・・・いけた! onclickは・・・だめだ、blockedに変換される。
- じゃあ、他のイベントはどうだ? おお、onMouseDownはブロックされない!(Firefox 3.6.3)
脆弱性の確認
ということで、以下のとおり、Snippetsを登録。
honnest-annieでログインし、Home画面に表示されている、登録したSnippetsのリンクをクリックすると、cookieの値が表示される。
解決方法
正しいエスケープ処理が必要なんだけど、特定タグは通したいと。後で追記予定。
*1:スタニスワフ・レムの作品「GOLEM XIV」からいただきました