web-dev-qa-db-ja.com

HTTP応答分割とPHP

PHP 4.4.2および5.1.2以降で解決されている)HTTP Response Splitting(HRS)の脆弱性への参照が多数あります(例 https:// en .wikipedia.org/wiki/HTTP_response_splitting )、または約9年間。

それでもCVE-2013-2652は、概念実証( http://archives.neohapsis.com/archives/bugtraq/2013-10)であっても、PHPを使用したWebCollabの脆弱性を報告しました/0117.html )が指定されていますPHP 5.4.7のバージョン。問題の識別では、問題ステートメントで「%0d%0a」が使用されています。

私はPHP=を自分で試しましたが、実際には2バイトの16進シーケンス0x0d0x0aの挿入を許可しませんが、%エンコードされた同等の6文字シーケンス%0d%の挿入は妨げません。 0a。

少なくとも表面的には、これは少し矛盾しているようです。つまり1)PHPは、6文字のシーケンス "%0d%0a"をヘッダーに挿入できるため、提案されているようにHRSセーフではありません。2)CVEで述べられている脆弱性-2013-2652(「%0d%0a」がPHPアプリケーション)による書き込みを許可されていた)は、少なくとも大幅に誇張されていました。

どれが本当ですか? (それとも完全に別のものですか?)

(注:a)他にどのような保護が適用されているかに関係なく、ユーザーが入力したデータを検証またはサニタイズする方がよいことを十分に理解しています。 b)WebCollabの修正は非常に簡単で、それだけを行います。ユーザーが入力した入力を許可された文字で検証します。ここでは、PHPのHRS安全性の堅牢性と、存在する場合の危険の性質に、より関心があります。

7
Henry

@timは正しいです。エクスプロイトはシーケンス_%0D%0A%20_を使用します。これはCR + LF + SPACEにURLデコードされ、一部の応答分割保護をバイパスできる余分なスペースのおかげでブラウザ。

linefoldingと呼ばれる機能がありました。これは、すべての追加行にスペースまたはタブを付加することにより、HTTPヘッダーを複数行にまたがることを可能にしました。しかし、後で RFC 72 で削除されました。 PHPはまだRFCを実装しておらず、IEに対して脆弱スペーストリック。この問題は2015年2月に解決され(バグ #68978 )、最終的にPHP5.4.38なので、バージョン5.4.7はまだ影響を受けていました。

5.4.38の changelog から:

RFC 7230で非推奨となった複数行ヘッダーのサポートを削除しました。

対応するコミット で、現在header()がキャリッジリターンとラインフィードを完全に拒否することを確認できます。彼らの位置に関係なく。結論として、この特定の方法による応答分割の悪用は、今日では廃止されているはずです。

5
Arminius