ホームページ >バックエンド開発 >PHPチュートリアル >PHPの脆弱性徹底解説(8) - HTTPレスポンスの分割
HTTPリクエストフォーマット
1) リクエスト情報: 例: "Get /index.php HTTP/1.1"、index.phpファイルをリクエスト
2) ヘッダー: 例: "Host: localhost"、サーバーアドレスを示す
3) 空白行
4) 情報テキスト
「リクエスト情報」と「ヘッダー」の両方は、改行文字 (CRLF) で終わる必要があります。空白行には改行のみを含めることができ、他のスペースは含めることはできません。
次の例では、HTTP リクエストをサーバー www.yhsafe.com
GET /index.php HTTP/1.1↙ //情報を要求します
Host:www.yhsafe.com↙ //Header
↙ //スペース行
↙
↙ 記号は Enter キーを表します。HTTP リクエストのヘッダーのうち、必要なのは Host ヘッダーのみであり、残りは空白行の後にスペースを押す必要があります。 HTTP ヘッダーは HTTP リクエストの内容によって異なります。
HTTPリクエストメソッド
1) GET: リクエストレスポンス
2) HEAD: GETと同じレスポンス、レスポンスヘッダーのみが必要です
3) POST: 処理のためにデータをサーバーに送信します。データはHTTP情報に含まれる 本文中
4) PUT: ファイルをアップロードする
5) DELETE: ファイルを削除する
6) TRACE: 受信したリクエストを追跡する
7) OPTIONS: サーバーがサポートする HTTP リクエストメソッドを返す
8) CONNECT: HTTP リクエスト接続を透過的な TCP/IP チャネルに変換します
HTTP レスポンス形式
サーバーはクライアントからの HTTP リクエストを処理した後、次のレスポンスを送信します。
1) 最初の行はステータス コードです
2) 2 行目はその他の情報で始まります
ステータス コードには、ステータスを識別する番号とステータスを説明する単語が含まれます。例:
HTTP/1.1 200 OK
200 はステータスを識別する数字であり、OK はステータスを説明する単語です。このステータス コードは、リクエストが成功したことを示します。
HTTPリクエストとレスポンスの例
cmdを開いてtelnetと入力し、open www.00aq.com 80と入力します
接続を開いて
GET /index.php HTTP/1.1↙
Host:www.00aqと入力します。 com↙
↙
↙
HTTP 応答のヘッダーを返します
返されたホームページのコンテンツ
PHP を使用して HTTP リクエストを送信します
header 関数を使用して、次のヘッダーを送信できますHTTP リクエストとレスポンス
関数プロトタイプ
void header(string string [, bool replace [, int http_response_code]])
string は HTTP ヘッダーの文字列です
replace が TRUE の場合、以前の同様のものを置き換えることを意味しますテーブルを現在のヘッダー header; replace が FALSE の場合、複数の同様のヘッダーを使用することを意味し、デフォルト値は TRUE です
http_response_code は、HTTP 応答コードに http_response_code の値を強制的に使用するために使用されます
例:
//インターネットソケット接続をオープンします
$fp = fsockopen(www.00aq.com, 80);
// HTTP リクエストヘッダーを書き込みます
fputs($fp, "GET / HTTP/1.1rn"); : www.00aq.comrnrn ");
// HTTP 応答文字列
$http_response = "";
while (!feof($fp))
{
// 256 ビット HTTP 応答文字列を読み取ります
$http_response .= fgets ($ fp,);
}
// インターネットソケット接続をオフにする
fclose ($ fp)
// HTTP 応答情報を表示する
Echo NL2BR ($ http_response)
HTTP 応答?分割するのは、攻撃者が電子メールまたはリンクの使用を注意深く設計し、ターゲット ユーザーが 1 つのリクエストを使用して 2 つの応答を生成できるようにするためです。前者の応答はサーバーの応答であり、後者は攻撃者によって設計された応答です。この攻撃は、WEB プログラムが HTTP 応答ヘッダーにユーザー データを配置し、これらのユーザー データが攻撃者によって慎重に設計されているために発生します。
HTTP リクエストの分割によって影響を受ける可能性のある関数には次のものがあります:
header(); setcookie(); setrawcookie();
Location ヘッダー:リダイレクトされた URL アドレスにデータを書き込みます
Set-Cookie header: ユーザーのデータを Cookie に書き込みます
例:
header("Location: " . $_GET['page' ])?> 1.1 302 Found
日付: Wed, 13 Jan 2010 03:44:24 GMT
サーバー: Apache/2.2.8 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
場所: http: //www.00aq.com
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
以下のリンクにアクセスしてください。ログイン ウィンドウが直接表示されます
http://localhost/location.php?page=%0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text /html%0d%0aContent-Length:%20158%0d%0a%0d%0aAccount%20Password%20
読み取り可能な文字列に変換されました:
Content-Type: text/html
HTTP/1.1 200 OK
Content -Type: text/html
Content-Length: 158
Account
Password
1つのHTTPリクエストで2つの応答が生成されました
防止方法:
1) CRLF改行文字を置き換えます
header("Location: " .strtr($_GET['page'], array("r"=>"", "n"=>"")));