この攻撃は、「fastcgi_split_path_info」を使用して URL の一部を分離し、PATH_INFO 環境変数を定義することによって PHP-FPM への転送が実行される nginx 構成で可能ですが、最初に「try_files $fastcgi_script_name」を使用してファイルの存在を確認しません。ディレクティブまたは「if (!-f $) document_root$fastcgi_script_name)」。 問題はまた、
場所〜[^ /] \。php(/ | $){
fastcgi_split_path_info ^(。+?\。php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
次のページの配布キットで問題の解決策を追跡できます。
try_files $fastcgi_script_name =404;
この問題は、ファイル内のポインターを操作する際のエラーによって発生します。
fastcgi_split_path_info ディレクティブが改行を区別する正規表現を使用してスクリプト パスを分割することを指定している場合 (たとえば、多くの例では "^(.+?\.php)(/.*)$" の使用が推奨されています)、攻撃者は空の値が PATH_INFO 環境変数に書き込まれます。 この場合、実行のさらに途中で
特定の方法でフォーマットされた URL をリクエストすることにより、攻撃者は path_info ポインタを「_fcgi_data_seg」構造の最初のバイトにシフトすることができ、このバイトにゼロを書き込むと「char* pos」が移動します。以前に配置されたメモリ領域へのポインタ。 次に呼び出される FCGI_PUTENV は、攻撃者が制御できる値でこのメモリ内のデータを上書きします。 指定されたメモリには他の FastCGI 変数の値も格納されており、攻撃者はそれらのデータを書き込むことで、架空の PHP_VALUE 変数を作成し、コードを実行することができます。
出所: オープンネット.ru