テーマ別解説

HTTPヘッダ

riss
1
HTTP Message

HTTPメッセージのフォーマット

HTTP(Hypertext Transfer Protocol)は、アプリケーション層で動作するプロトコルで、HTTPメッセージとして通信する。HTTPメッセージにはブラウザからサーバーに対するリクエストメッセージとサーバーからブラウザに対するレスポンスメッセージがある。

HTTPメッセージのフォーマット

リクエストメッセージレスポンスメッセージ
リクエストライン
(例)GET␣/XX HTTP2.0
ステータスライン
(例)HTTP2.0␣200␣OK
メッセージヘッダ
・リクエストヘッダ
・一般ヘッダ
・エンティティヘッダ
・その他のヘッダ
メッセージヘッダ
・レスポンスヘッダ
・一般ヘッダ
・エンティティヘッダ
・その他のヘッダ
空行空行
メッセージボディメッセージボディ

(例)令和4年度春期午後Ⅱ問1

このページでは、このうちメッセージヘッダについて解説する。

メッセージヘッダの種類

  • リクエストヘッダ/レスポンスヘッダ
    リクエストメッセージ又はレスポンスメッセージを制御するヘッダをいう。複数ある場合は、改行コードで区切って複数行で記述する(HTTPヘッダインジェクション参照)。
    (例)Host、Referer、User-Agent、Age、Set-Cookie、Cookie、X-Forwarded-For
  • 一般ヘッダ
    リクエストメッセージとレスポンスメッセージの両方で使用されるヘッダをいう。
    (例)Cache-Control
  • エンティティヘッダ
    リクエストメッセージとレスポンスメッセージに含まれるメッセージボディに関連する制御情報を含むヘッダをいう。
    (例)Expires
2
Request Header

リクエストヘッダ

Host

接続先のホスト名を指定する。

Host: www.a-sha.co.jp

1つのIPアドレスで複数のホスト名を対応させた場合に、Hostヘッダによりホスト名を指定することができる。

Referer

直前のリンク元のURLを通知する。

Referer: Http://www.b-sha.co.jp

利用者が正規のWebページから遷移されてきたのか知ることができ、クロスサイトリクエストフォージェリ(CSRF)攻撃の対策となる。

Cookie

ブラウザに保存しているCookieをWebサーバへ転送する。セッションIDを格納し、ログイン状態にするなどの利用方法がある。

Cookie: SESSIONID=12345

Cookieには以下の属性がある。

  • Secure属性
    HTTPS通信に限りWebサーバにcookieを送信する。
  • HttpOnly属性
    JavaSpcriptなどからCookieを読み出すことを禁止する。クロスサイトスクリプティング(XSS)攻撃への対策として有効である。
  • SameSite属性
    Laxを指定すると、異なるドメインを経由してアクセスした場合にcookieの送信を禁止する。クロスサイトリクエストフォージェリ(CSRF)攻撃への対策として有効である。
  • Expires属性
    cookieの有効期限を指定する。cookieの不正利用を防止するため、長い期限を指定しないことが推奨されている。指定しない場合はブラウザ終了時にcookieを削除する。
  • Domain属性
    cookieを使用するドメイン名を指定する。指定しない場合はブラウザが接続したWebサーバのFQDNを設定する。
  • Path属性
    cookieを使用するパス名を指定する。

User-Agent

OS、ブラウザの種類、バージョンなどをWebサーバに転送する。

User-Agent: Mozilla/5.0

Webサーバ側において利用する端末やブラウザを把握することができるため、リスクベース認証に利用される。

X-Forwarded-For

プロキシサーバなどを経由してWebサーバに接続する際に、接続元のIPアドレスを格納する。

X-Forwarded-For: クライアント側のIPアドレス, プロキシのIPアドレス

Xから始まるHTTPヘッダは、非標準であるものの、多くのWebサーバやプロキシで慣習的に用いられ、事実上の標準とされている。

3
Response Header

レスポンスヘッダ

Set-Cookie

Webサーバが発行したCookieをブラウザに送る。

Set-Cookie: SESSIONID=12345

レスポンスヘッダのSet-CookieによりWebサーバから受け取ったcookieをブラウザに保存し、次回同じWebサーバにアクセスした際に、リクエストヘッダのCokkieにより、Webサーバにcookieを送信する。これにより、前回アクセスしたときの情報を引き継ぐことができる(セッション管理)。

Location

リダイレクト先のURLを通知する。

Location: Http://www.c-sha.co.jp

Content-Security Policy(CSP)

ブラウザがコンテンツを読み込むときの動作を規定する。

content-security-policy.default-src 'self

上記の場合、ブラウザは全てのコンテンツをブラウザの接続先と同一オリジン(同一生成元)のサーバだけから読み込む。

オリジンは、スキーム(https//など)、FQDN(www.a-sha.co.jpなど)、ポート番号(:443など)の3つをいう。

異なるオリジンのコンテンツを読み込まないことで、クロスサイトスクリプティング(XSS)攻撃やクリックジャッキング攻撃の対策として使用される。

X-Frame-Options

フレーム内に画像を読み込む条件を指定する。

X-Frame-Options: DENY

パラメータ(上記のDENY)は以下のとおりである。

  • DENY
    フレーム内に表示することができない。
  • SAMEORIGIN
    同一オリジンの画面のみのフレーム内に表示することができる。
  • ALLOW-FROM
    指定したオリジンの画面のみのフレーム内に表示することができる。

Content-Security Policy(CSP)と同様、クリックジャッキング攻撃の対策として有効である。現在は、標準化されているContent-Security Policy(CSP)の仕様が推奨されている。

Strict-Transport-Security(HSTS)

Webサーバへのリクエスト時にHTTPS接続を強制する。

Strict-Transport-Security: max-age=31536000;

max-ageパラメータでHTTPS接続を強制する期間を指定することができる。上記の場合は31,536,000秒=1年間有効となる。

HSTSは次回のアクセス時からHTTPS接続を強制するものであり、初回のアクセス時には強制することができない。そこで、HSTSプリロードにあらかじめサイトのリストを登録することで、ブラウザは初回からHTTPS接続を行うことができる。

4
common header

一般ヘッダ

Cache-Control

ブラウザとWebサーバ間の経路中の総理に対するキャッシュ動作を通知する。

Cache-Control: max-age=31536000;

max-ageパラメータでキャッシュの有効期間を指定することができる。上記の場合は31,536,000秒=1年間有効となる。

パラメータは以下のとおりである。

  • private
    Webサーバが応答するコンテンツが一人の利用者のためのものであることを示す。
  • no-store
    Webサーバが応答するコンテンツのキャッシュへの記録を禁止することを示す。
  • no-cache
    キャッシュに記録されたコンテンツは、有効性の確認がとれない限り再利用してはならないことを示す。
  • max-age
    キャッシュの有効期限を指定する。
5
HTTP header injection

HTTPヘッダインジェクション

HTTPヘッダインジェクションとは

①メッセージヘッダ(HTTPヘッダ)は1回改行すると別のメッセージヘッダを設定することができる。また、②2回改行すると、空行が生じるため、以降の行はメッセージボディとして認識される。さらに、③改行後に新たなレスポンスメッセージを記述すると、複数のレスポンスに分割することができる。メッセージヘッダに改行コードを組み込み、不正に上記の事象を生じさせる攻撃をHTTPヘッダインジェクションという。

改行コードは「CR」「LF」又はURLエンコード後の「%0d%0a」である。

出題例:令和4年度春期午後1問1

攻撃の手順(例)

わなサイトへの誘導

攻撃者が標的の利用者に対して、わなサイトのURLをメールで送る。

https://www.a-sha.co.jp?SESSIONID=abcd%0d%0a%0d%0a<html><body><script>(不正なスクリプト文)</script></body></html>

HTTPリクエスト

標的の利用者がURLをクリックすると、不正なパラメタを含むHTTPリクエストが標的サイトへ送信される。

HTTPレスポンス

標的サイトは、受信したパラメタをレスポンスヘッダに出力する。

HTTP/1.1 200 OK
Set Cookie SESSIONID=abcd
(空行)
<html><body><script>(不正なスクリプト文)</script></body></html>

スクリプトの実行

2回改行されることで、その後の行(<html>以降)がHTTPボディとして認識され、不正なスクリプトが実行される。

対策

HTTPヘッダインジェクションの原因は、HTTPヘッダ中で改行されることにある。したがって、対策として以下の方法が考えれられる。

  • 入力パラメタからレスポンスヘッダを出力せずに、改行コードの混入を防ぐヘッダAPIを利用する。
  • 改行コードをエスケープ処理する。
記事URLをコピーしました