CGIモードでのPHPの脆弱性

一部の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/で入手できます。 変更のログがあります



All Articles