ホームページ  >  記事  >  バックエンド開発  >  PHPの脆弱性徹底解説(8) - HTTPレスポンスの分割

PHPの脆弱性徹底解説(8) - HTTPレスポンスの分割

黄舟
黄舟オリジナル
2016-12-22 09:44:441501ブラウズ

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↙

PHPの脆弱性徹底解説(8) - HTTPレスポンスの分割

HTTP 応答のヘッダーを返します

PHPの脆弱性徹底解説(8) - 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 リクエストの分割によって影響を受ける可能性のある関数には次のものがあります: PHPの脆弱性徹底解説(8) - 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"=>"")));



2) 最新バージョンを使用します。 PHP の最新バージョンでは、HTTP ヘッダーで改行文字が使用できなくなりました。php.ini の Off

php、option Expose_php = Off

上記は、PHP の脆弱性に対する完全な解決策 (8) - HTTP 応答です。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

PHPの脆弱性徹底解説(8) - HTTPレスポンスの分割

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。