一部のCGIベースの設定には脆弱性があり(Apache + mod_phpおよびNginx + PHP-FPMには影響しません)、少なくとも8年間は気付かれていません。
CGI仕様のセクション7は次のように述べています 。
一部のシステムは、文字列の[sic]配列をCGIスクリプトに渡す方法をサポートしています。 「インデックス」クエリの場合にのみ使用されます。 暗号化されていない「=」文字を含まないURL検索文字列で「GET」または「HEAD」HTTP要求を定義します。
そのため、一部のCGI実装では、
「=」記号を含まないリクエストの処理が異なります。 PHPの場合、これは
?-Sを含むリクエストがページのPHPソースコードをマージできることを意味しますが、リクエスト
--S&= 1を使用するとすべて問題あり
ません 。
多数のサイトが、mod_phpを介してApacheモジュールとして、またはNginxでPHP-FPMを使用してPHPを実行しています。 これらの方法はどれもこれに対して脆弱ではありません。 CGIを使用した直接作業もこの脆弱性の影響を受けません。
Apache mod_cgiを使用してPHPを実行している場合、脆弱性がある可能性があります。 これを確認するには、
?-SをURLの最後に追加します。 ソースコードが表示される場合、脆弱です。 あなたのサイトが開いたら、すべてが順番通りにある可能性が高いです。
これを修正するには、PHP 5.3.12またはPHP 5.4.2にアップグレードします。
CGIでは、PHPを実行するのにかなり時代遅れの方法であり、サイトを最新バージョンのPHPにアップグレードできない可能性があることを認識しています。 または、
「-」で始まり
「=」を含まないこの種の要求を防ぐようにWebサーバーを設定できます。 このルールを追加しても、サイトの運用に影響はありません。 mod_rewriteを使用するApacheの場合、次のようになります。
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]
独自のルールを作成する場合は、urlencoded
?%2dsバージョンを考慮することを忘れないでください。
悪い週は悪化しました。 バグトラッカーにバグがあり、エラーメッセージへのコメントでエラーレポートのプライベートフラグをパブリックに切り替えました。これにより、必要なレベルのソリューションをテストする前に、この問題がパブリックになりました。
bugs.php.net経由ですべての問題を報告してください。
PHP 5.3.12またはPHP 5.4.2をダウンロードするに
は、ダウンロードページにアクセスし
てください 。 Windowsバイナリは
windows.php.net/download/で入手できます。
変更のログがあります 。