Описание
cgi.force_redirect configuration is bypassable due to the environment variable collision
Summary
According to https://www.php.net/manual/en/security.cgi-bin.force-redirect.php, the configuration directive cgi.force_redirect
prevents anyone from calling PHP directly with a URL like http://host.example/cgi-bin/php/secretdir/script.php
.
The default value of cgi.force_redirect
is 1
.
But there is a bug that can cause attackers to bypass restrictions and access php-cgi directly.
Details
Both REDIRECT_STATUS
or HTTP_REDIRECT_STATUS
are considered legal environment variable while cgi.force_redirect
is turned on:
https://github.com/php/php-src/blob/master/sapi/cgi/cgi_main.c#L1905
Unexpectedly, Redirect-Status
header is converted to the HTTP_REDIRECT_STATUS
environment variable, allowing the attacker to bypass the cgi.force_redirect
variable through HTTP headers.
Impact
The cgi.force_redirect
configuration can be bypassed.
While this does not pose significant security risks in most common configurations, certain configurations that modifies the SCRIPT_FILENAME
environment variable may allow the arbitrary file inclusion.
Пакеты
< 8.1.30
8.1.30
< 8.2.24
8.2.24
< 8.3.12
8.3.12
Связанные уязвимости
In PHP versions 8.1.* before 8.1.30, 8.2.* before 8.2.24, 8.3.* before 8.3.12, HTTP_REDIRECT_STATUS variable is used to check whether or not CGI binary is being run by the HTTP server. However, in certain scenarios, the content of this variable can be controlled by the request submitter via HTTP headers, which can lead to cgi.force_redirect option not being correctly applied. In certain configurations this may lead to arbitrary file inclusion in PHP.
In PHP versions 8.1.* before 8.1.30, 8.2.* before 8.2.24, 8.3.* before 8.3.12, HTTP_REDIRECT_STATUS variable is used to check whether or not CGI binary is being run by the HTTP server. However, in certain scenarios, the content of this variable can be controlled by the request submitter via HTTP headers, which can lead to cgi.force_redirect option not being correctly applied. In certain configurations this may lead to arbitrary file inclusion in PHP.
In PHP versions 8.1.* before 8.1.30, 8.2.* before 8.2.24, 8.3.* before 8.3.12, HTTP_REDIRECT_STATUS variable is used to check whether or not CGI binary is being run by the HTTP server. However, in certain scenarios, the content of this variable can be controlled by the request submitter via HTTP headers, which can lead to cgi.force_redirect option not being correctly applied. In certain configurations this may lead to arbitrary file inclusion in PHP.
In PHP versions 8.1.* before 8.1.30, 8.2.* before 8.2.24, 8.3.* before ...