WEB制作時の最低限のセキュリティ対策とサイバー攻撃一覧

ホームページ制作時、例えばログイン機能やメールフォームなどの動的なページを作る時、その動作自体に意識が集中してしまい、セキュリティ面の対策がおろそかになりがちです。

そこで、Web制作をする上で知っておきたいサイバー攻撃の種類とその対策についてまとめてみました。
後半はWeb制作とあまり関係ないかも。。。

ここでは、どんなサイバー攻撃が存在するのか全体把握を目的にリストアップしています。それぞれについてもっと詳しく知りたい場合は個別にググってください(^^)

ページが長くなるので先にまとめを

かなりたくさんの種類のサイバー攻撃があるんですね。
それぞれの攻撃を組み合わせる事で、より複雑な攻撃になり同時にその対策も複雑になります。

例えばXSSやCSRFなどよく知られた攻撃に対する対応策を調べると、定番といえる方法がいくつか見つかります。しかし、一つ一つ詳しく見ていくとどれも完璧ではなく、あらゆる攻撃に対応するコードを書くことは、とても複雑で困難です。

とは言え、全く対策をしない場合と比べたら、最低限の対策をするだけでも格段にセキュリティレベルは高くなります。

まとめてみた結果、Web制作において特に以下の5つの攻撃については、定番の対応方法もありますし、最低限意識して作業をしたいなと感じました。

・XSS(クロス・サイト・スクリプティング)
・SQLインジェクション
・CSRF(クロス・サイト・リクエスト・フォージェリ)
・セッションハイジャック
・クリックジャッキング

XSS(クロス・サイト・スクリプティング)

フォームなどにスクリプトを入力することで、Webアプリケーションに意図しない動作をさせる。

想定される危険性

・cookie情報やsession情報の漏洩
・サイトの改ざん
・攻撃者による他様々なスクリプトの実行

対策

フォームなどに入力された値に対してエスケープ処理(サニタイジング)をする。
つまり、不正なスクリプトが入力されてもそれが実行されないよう、スクリプト特有の文字列について置き換えをする。

例えば、

< → &lt;
> → &gt;
& → &amp;
 → &quot;
 → #39;

PHPなら、htmlspecialchars関数を使う。
JavaScriptなら、エスケープ関数を作るなど。

function escape(str) {
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/"/g, '&quot;');
    str = str.replace(/'/g, '&#39;');
    return str;
}

SQLインジェクション

フォームなどに「SQL言語」を注入(インジェクション)し、Webアプリケーションに意図しない動作をさせる。
XSSと同様の攻撃ですが、こちらはデータベースを標的にする分、被害が大きい場合があります。

想定される危険性

・ユーザーの個人情報やその他データーベースにある情報の漏洩
・データーベースの改ざん
・攻撃者による他様々なスクリプトの実行

対策

・XSSと同様にエスケープ処理をする

・エラーメッセージの表示をしない
開発環境ではエラーメッセージは必要ですが、本番環境でエラーメッセージを表示すると、データーベースの構造を把握させるヒントになってしまう可能性があります。

・バックエンドのSQL文などに工夫をする
 文字エンコーディングを指定する
 プレースホルダを使う
 バインド時に型を指定する
 (詳しくは割愛)

同様の攻撃

OSコマンドインジェクション

サーバのOSを標的にし、シェルを呼び出し不正コマンドを実行する。

LDAPインジェクション

LDAPサーバを標的にして、不正にデータを引き出す手法。

CSRF(クロス・サイト・リクエスト・フォージェリ)

外部サイトからリクエストを投げて、Webアプリケーションに不正な動作をさせる。

想定される危険性

・なりすまし、アカウント乗っ取り
・その他、様々な情報漏洩

対策

サーバに送られてきたリクエストが、外部からのものでないか確認する。

例えば、トークンと呼ばれるキーを生成し、送信時にフォームに埋め込み、リクエスト受取時に一致するかを確認する。
アクセスするたびに変わるトークンの事をワンタイムトークンという。

トークンの生成例(PHP)

$token = sha1(random_bytes(30));

セッションハイジャック

その名の通り、セッションを乗っ取って、本人になりすましてサービスを不正利用する。

想定される危険性

・なりすまし、アカウント乗っ取り
・オンラインバンクの出金やクレジットカードの不正利用
・その他、様々な情報漏洩

対策

セッションIDが表に出ないようにする。
セッションIDをその都度変更する。PHPなら、session_regenerate_id関数を使うなど。

同様の攻撃

セッションID固定化攻撃

セッションフィクセーションとも呼ばれます。
セッションハイジャックと似ていますが、セッションハイジャックが他人のセッションを盗むのに対して、こちらは、攻撃者が用意したセッションを標的となるユーザーに使わせることで、そのセッションを有効なものにしてなりすまします。

クリックジャッキング

iframeなどを使って、サイトの上に透明なボタンを重ねるように配置し、ユーザーにクリックさせることで意図しない動作をさせる。

想定される危険性

・クリックによって動作する機能すべての偽装
 例えば、商品購入や設定変更、メッセージ投稿など
・ウィルス感染
・PC乗っ取り
・その他、様々な情報漏洩

対策

サイトのHTTPレスポンスヘッダーに「X-FRAME-OPTIONS」を追加する。

サーバ(Apache)で設定する場合

「.htaccess」ファイルに以下を追記

<ifModule mod_headers.c>

#全ドメインで禁止したい場合
Header always set X-Frame-Options DENY

#同一ドメイン内のみ許可したい場合
Header always set X-Frame-Options SAMEORIGIN

#指定されたドメインに限り許可したい場合(バグや未対応ブラウザあり)
Header always set X-Frame-Options ALLOW-FROM [https://domain.com]

</ifModule>

PHPで設定する場合

//全ドメインで禁止したい場合
header('X-Frame-Options: DENY');
 
//同一ドメイン内のみ許可したい場合
header('X-Frame-Options: SAMEORIGIN');
 
//指定されたドメインに限り許可したい場合(バグや未対応ブラウザあり)
header('X-Frame-Options: ALLOW-FROM https://domain.com');

フォームジャッキング

ECサイトや購入ページを改ざんし、利用者の個人情報を収集します。

想定される危険性

・利用者の個人情報やクレジットカード情報などの漏洩
・サイトの改ざん
・攻撃者による他様々なスクリプトの実行

対策

この攻撃は、サイトが事前にハッキングされる事で起こります。
サイトの管理画面へのログインが不正にされていないか、パスワードは推測されにくいものになっているかなどのチェック。
また、CMSなどのアップデートがある場合は最新のものにするなど、セキュリティの脆弱性をなるべくなくす事が大切です。

ディレクトリ・トラバーサル

そのサイトに実装されているプログラムを悪用して、本来なら見れない場所に置いてあるファイルを表示させる。

例えば、パラメーター(ファイル名)を受け取ったら、そのファイルの中身を表示させるプログラムがあった場合、攻撃者が入力したファイル名があれば表示してしまいます。非公開ディレクトリにあるファイルでも、内部プログラムからの要求なので防げません。
名前の通り、階層をまたいであらゆる場所のファイルへのアクセスも許してしまいます。

想定される危険性

・サーバ内部のファイルとその中の情報漏洩
 漏洩した内容によっては、乗っ取りや改ざんなど様々なリスクがあります。

対策

・外部から入力されたパラメーターをそのまま使わない。
・ファイルを取ってくるプログラムを組む時は、固定されたディレクトリを指定する。

バッファオーバーフロー

許容範囲以上のデータを送ることでWebアプリケーションのデータ処理をオーバーフローさせて、それによってできたセキュリティホールを利用してサーバに侵入します。

想定される危険性

・乗っ取りや改ざん
・別のターゲットへの攻撃の踏み台にされるなど

対策

・オーバーフローを起こさないよう、サーバのメモリやバッファについて常に意識したコードを心がける。
・対策されたライブラリを利用する。

同様の攻撃

DoS/DDoS攻撃

大量のリクエストなどを投げ、サーバへ負荷をかけ最終的にダウンさせる。
バッファオーバーフローが内部侵入目的なのに対し、DoS/DDoS攻撃はサーバのダウンが目的です。

F5アタック

これもDoS/DDoS攻撃の一種。

ブルートフォースアタック(総当たり攻撃)

あるログインIDに対してパスワードを一つずつ変えて不正ログインしようとする力技の攻撃。

同様の攻撃

リバースブルートフォース攻撃

パスワードスプレー攻撃とも呼ばれます。ブルートフォースアタックがログインID固定なのに対して、こちらはパスワードを固定して複数のログインIDを使ってログインを試みます。
一定回数ログインに失敗するとアカウントロックするようなセキュリティシステムであっても、1つのアカウントに対しては一回の攻撃のためアカウントロックされません。

パスワードリスト攻撃

不正に入手したIDやパスワードのリストを元に不正ログインを試みます。
プログラムを使って自動的にこれを行う攻撃を、クレデンシャルスタッフィング攻撃という。

ドメイン名ハイジャック

その名の通りドメインを乗っ取ります。
なんらかの方法でDNSやレジストリを書き換え、対象のドメインへのアクセスを攻撃者のサーバへ転送します。

ドライブバイダウンロード

Webサイトへ不正プログラムを仕込み、ユーザーがアクセスした際に自動的にダウンロードさせて、PCにマルウェアをインストールします。

ゼロデイ攻撃

OSやアプリケーションなどのセキュリティ脆弱性が発見されてから、修正バッチが配布されるまでの間を狙ったサイバー攻撃。

サプライチェーン攻撃

大手企業などセキュリティレベルが高いシステムへ侵入するために、一旦セキュリティレベルの低い子会社や取引先企業などを標的にサイバー攻撃をしかける手法。

ポートスキャン攻撃

サーバの通信可能なポートを全てスキャンすることで、使われてるサービスを特定するなどし、目的のサイバー攻撃のヒントを得る。

クロスサイト・クッキング

ブラウザの脆弱性を利用し、外部から不正なクッキーをサーバに送る。