JavaScriptセキュリティの基礎知識

第3回 Webセキュリティのおさらい その3 CSRF・オープンリダイレクト・クリックジャッキング

この記事を読むのに必要な時間:およそ 4.5 分

オープンリダイレクト

オープンリダイレクトはどのように引き起こされるのか

Webアプリケーション内に,指定されたほかのページへリダイレクトする機能がある場合に,その機能を利用して,攻撃者が指定した任意のURLへリダイレクトが可能になってしまう脆弱性をオープンリダイレクトといいます。

たとえば,http://example.jp上で動作するWebアプリケーションにおいて,http://example.jp/go?url=/next.htmlというURLにアクセスするとhttp://example.jp/next.htmlへリダイレクトする機能があったとします。

GET /go?url=/next.html
Host: example.jp

HTTP/1.1 302 Moved Temporarily
Location: /next.html
Content-Length: 0

このような同一サイト内でのほかのページへのリダイレクトを想定して作られている機能において,http://example.jp/go?url=http://attacker.example.com/evil.htmlのようにhttp://example.jpとは異なるサイトのURLを指定したときに,そのサイトにリダイレクトしてしまうのがオープンリダイレクトです。

GET /go?url=http://attacker.example.com/evil.html
Host: example.jp

HTTP/1.1 302 Moved Temporarily
Location: http://attacker.example.com/evil.html
Content-Length: 0

オープンリダイレクトによって,攻撃者はURLをそのサイト内の一部だと見せかけてユーザーを悪意あるサイトへ誘導したり,検索エンジンでの表示順位を汚染するSEOポイズニングなどに悪用することがあります。XSSやCSRFとは違って,Webサイトそのものやユーザーに直接的な被害が及ぶわけではありませんが,URLとして表示されているドメインを信頼して訪問したにも関わらずほかのサイトへリダイレクトされてしまうのは,サイトやドメインに対する信頼を損ねることにもつながります。

オープンリダイレクトへの対策

オープンリダイレクトへの対策としては,リダイレクト先のURLをあらかじめWebアプリケーション内で固定のリストとして保持しておき,それ以外のサイトへのリダイレクトを発生させないというのが最も堅実な方法となります。例として,以下のPHPコードを見てみましょう。

$targets = array( 
    'next' => '/next.html',
    'login' => '/login.html'
);
$nexturl = $_GET['url'];
if (isset($targets[$nexturl])) {
     header('Locatoin: ' . $targets[$nexturl]);
}else{
     header('Locatoin: /');
}

このPHPのコードでは,

  • http://example.jp/go?url=nextというURLにアクセスされたときは,http://example.jp/next.htmlへ
  • http://example.jp/go?url=loginというURLにアクセスされたときは,http://example.jp/login.htmlへ
  • それ以外の場合は,http://example.jp/へ

とリダイレクトされることになり,攻撃者によってリダイレクト先をコントロールされる余地がなく,オープンリダイレクトとして悪用されることもありません。

クリックジャッキング

クリックジャッキングはどのように引き起こされるのか

クリックジャッキングとは,攻撃対象となるWebサイトを透明にした状態で,iframeなどを用いて攻撃者の用意した罠サイト上に設置し,罠サイト上でユーザーにクリックなどの操作の錯誤を起こさせる攻撃手法です。

罠サイトでは,訪問してきたユーザーがうっかりクリックしたくなるようなコンテンツが表示されていますが,そのコンテンツには攻撃対象となるWebサイトが透明になった状態で,iframeなどで重なって配置されています。そのため,ユーザーが罠サイト上のコンテンツをクリックすると,実際にはiframe内のWebサイトに対してクリックが発生してしまいます。iframe内のWebサイトでは,クリックすることで副作用が発生するような機能のボタンなどを配置しておくことで,ユーザーのクリックによってCSRF同様にユーザーに強制的に操作を行わせることができてしまいます。

クリックジャッキング

クリックジャッキング

クリックジャッキングへの対策

Webアプリケーションとしてクリックジャッキングへの対策を行うには,該当ページをframeやiframe内に表示されないようにする必要があります。そのために使われるのが,X-Frame-Options HTTPレスポンスヘッダです。X-Frame-Optionsレスポンスヘッダが指定されたリソースは,ブラウザ上でframeやiframeでの表示が禁止されます。

X-Frame-Optionsでは,以下の3通りの指定が可能です。

X-Frame-Options: DENY
→該当ページのframeやiframeへの埋め込みを一切禁止する
X-Frame-Options: SAMEORIGIN
→該当ページのframeやiframeへの埋め込みは,同一オリジンからの場合のみ許可される
X-Frame-Options: ALLOW-FROM http://example.com
→該当ページのframeやiframeへの埋め込みは,指定されたオリジンからの場合のみ許可される

DENYを指定した場合には,自サイトからであっても,フレーム内にそのコンテンツを読み込めなくなります。

Webセキュリティのおさらい まとめ

本連載の第1回から第3回までで,Webセキュリティのおさらいとして,攻撃には能動的攻撃と受動的攻撃があり,受動的攻撃としてはXSS,CSRF,オープンリダイレクト,クリックジャッキングがあることを説明しました。

CSRFやクリックジャッキングなどは,Webアプリケーション自身の問題というよりは,Webの仕組みそのものが持つ問題がWebが成熟するとともに顕在化してきたともいえるかもしれません。また,オープンリダイレクトのように,Webアプリケーション側の脆弱性なのか素直に判断しにくい問題もあります。

このような問題についてもWebアプリケーション側で対策が迫られるのは,Webというものがより日常生活に密着し,高い信頼性が求められるようになってきたからでもあります。

著者プロフィール

はせがわようすけ

株式会社セキュアスカイ・テクノロジー常勤技術顧問。 Internet Explorer,Mozilla FirefoxをはじめWebアプリケーションに関する多数の脆弱性を発見。 Black Hat Japan 2008,韓国POC 2008,2010,OWASP AppSec APAC 2014他講演多数。 OWASP Kansai Chapter Leader / OWASP Japan Board member。

URL:http://utf-8.jp/