Webサイトの管理者であれば、自分(自社)のサイトの脆弱性を取り除いておく事が必要になります。
特に、代表的なハッキング手法である「クロスサイトスクリプティング(XSS)」や「SQLインジェクション」対策をしておくことは必須でしょう。
また、今回紹介する「HTTPヘッダインジェクション」も、有名なハッキング手法になりますので、ぜひ対策をしておいてください。
今回の記事では、この「HTTPヘッダインジェクション」の仕組みや、対策について順に解説していきます。
以下、目次になります。
- 「HTTPヘッダインジェクション」の仕組み
- 「HTTPヘッダインジェクション」の対策
「HTTPヘッダインジェクション」の仕組み
HTTPヘッダインジェクションを理解するためには、まずHTTPの仕組みや、HTTPを利用した通信手順を理解していなければなりません。こちらは、下記で解説しています。
http(通信プロトコル)とは?httpの仕組みと、通信内容(リクエストヘッダとレスポンスヘッダ)の確認手順まとめ
上記(リンク先)で解説している通り、HTTPを利用した通信の流れは、まずユーザーがブラウザを利用して、リクエストを送ります。次に、リクエストを受け取ったWebサーバー(サイトを公開しているサーバー)が、送り元に対してレスポンスを返します。
以下、図解しています。
この流れで、普段私たちはインターネット上でWebサイトを閲覧してるんですね。
ですが、リクエスト時のデータ(ユーザーが設定できる「リクエストボディ」)に、悪意のあるコードが埋め込まれると、場合によっては「レスポンスボディ」が改ざんされ、本来と違った内容のWebコンテンツが表示される事になります。
※「リクエストボディ」と「レスポンスボディ」に関しては、上記リンク先【http(通信プロトコル)とは?httpの仕組みと、通信内容(リクエストヘッダとレスポンスヘッダ)の確認手順まとめ】で解説しています。
例として、「http://あなたのサイト.com?location=●●●●●」にアクセスするとします(リクエストボディは、「location=●●●●●」)
上記リクエストを受け取ったあなたのサイト(サーバー)は、「location」パラメーターに設定されている”●●●●●”を、レスポンスヘッダの「Locationヘッダ」に設定して、レスポンスするとします。
この時、何も対策していない場合は、非常に危険な状態です。
なぜなら、”●●●●●”に、改行(コード)が二つ設定されていた場合、それ以降の文字列で「レスポンスボディ」を改ざんすることができるからです。
下図は、レスポンスの構成情報です。
上図から、「レスポンスヘッダ」と「レスポンスボディ」の切り分けは、『一行の改行』です。
改行のみの行があったら、それ以降は「レスポンスボディ」として扱われるのです。
これで、上述している・・・「”●●●●●”に、改行(コード)が二つ設定されていた場合、それ以降の文字列で「レスポンスボディ」を改ざんすることができる」事が理解できるでしょう。
もっと具体的な例を出しましょう。
上記で「%0d」というのが改行コードになります。これが、二つ設定されているので、それ以降の文字列「<script type=”text/javascript”>alert(“バカ”);</script>」は、「レスポンスボディ」に設定されることになります。
※上記では、解説上 分かりやすいように「改行」以外は、URLエンコードしてませんが、実際は「改行以外の文字列」も、URLエンコードしなければなりません。
「URLエンコード」とは・・・改行→「%0d」 のように、URLで扱う事のできない文字列を、扱えるように変換する仕組みです。
以上が、「レスポンスボディ」が改ざんされる仕組みになります。
「レスポンスボディ」が改ざんされるという事は、ユーザーに表示されるWebコンテンツが改ざんされるという事ですから、『ユーザーの個人情報の入力を促す入力フォーム』を設置したり、『ユーザーのクッキー(cookie)情報を抜き取るスクリプト(javascript)』を埋め込むことができるということです。
※今回解説した「レスポンスボディの改ざん」は、リクエストボディの値を、レスポンスヘッダの値へ設定することが前提となっています。
リクエストボディの値を、レスポンスヘッダの値へ設定しない場合は、このような脆弱性はありません。
またユーザーは、「(攻撃者が設定した)リクエストボディ」が設定してあるURL(リンク)を介して、Webサイトへアクセスしないと、被害を受ける事はありません(下図参考)
勘違いしやすい部分ですが、「レスポンスボディ」が改ざんされても、そのレスポンスが返されたユーザーのみ、表示されるWebコンテンツ(レスポンスボディ)が改ざんされているので、他のユーザーは被害を受けませんし、Webサーバーにあるコンテンツそのものが改ざんされるわけではありません。
以上が、「HTTPヘッダインジェクション」の仕組みになります。
次は、「HTTPヘッダインジェクション」への対策について解説していきます。
「HTTPヘッダインジェクション」の対策
「HTTPヘッダインジェクション」への対策としては、以下二つがあります。
- リクエストボディの値を、レスポンスヘッダの値へ設定しない
- リクエストボディの値を、レスポンスヘッダの値へ設定する場合は、「改行コード」をエスケープする
上述している通り、「HTTPヘッダインジェクション」は、リクエストボディの値をレスポンスヘッダへ設定する事が、攻撃条件となっています。
なのでそもそも、リクエストボディの値をレスポンスヘッダへ設定しなければ、「HTTPヘッダインジェクション」をされることはありません。
ですが、どーしても「リクエストボディの値をレスポンスヘッダへ設定しなければいけない」場合は、リクエストボディに含まれている改行コード「%0d」をエスケープしてから、レスポンスヘッダへ設定します。
これにより、改行コードは “%0d” という文字列のまま扱われるので、「HTTPヘッダインジェクション」を防ぐことができます。
対策手順としては、まず前提として「サーバーサイドのプログラム言語(PHP、Perl、Ruby等)」を使える事が必要です。
プログラムと言うと、非常に難しい印象を持ちますが、サイトの管理者であれば、ある程度の知識は持っておいた方が良いでしょう。
※今回の解説では、PHPでの対策手順を解説していきます。
サーバーサイドの言語(PHP)が利用できる環境であれば、対策は非常に簡単です。
リクエストボディに設定された文字列を、下記関数に通せば済みます。
PHPに用意されている「htmlspecialchars」という関数が、文字列をエスケープしてくれる関数になります。
三つの引数($str, ENT_QUOTES, ‘UTF-8′)が、設定でき、一つ目の「$str」の部分に、リクエストボディに設定された文字列を設定します。
あとは、エスケープする際のルール(「ENT_QUOTES」の部分)や、エスケープされた文字列の文字コード(‘UTF-8′)を指定できます。
以上です。
PHPに用意されている関数を使うだけなので、PHPさえ使えれば、非常に簡単に「エスケープ」することができます。
まとめ
今回の記事では、「HTTPヘッダインジェクション」の仕組みと対策について解説してきました。
有名な攻撃手法ですので、サイトの運営者であれば、必ず対策をとっておきましょう。
また、サイトを運営している場合「HTTPヘッダインジェクション」以外にも、様々な驚異から、サイトを守らなければなりません。
そこで、サイト運営者がやっておかなければならない「脅威対策」を、総合的にまとめている記事がありますので、ぜひ確認しておいてください→【ハッキング対策まとめ!自分のサイトを守るための9つの方法】