
Exploit de prova de conceito para CVE-2020-25867 demonstrando bypass de type juggling do PHP da autenticação da chave de compartilhamento do calendário SoPlanning.
O sistema de chave de compartilhamento é vulnerável a um ataque de Type Juggling do PHP, que permite a um invasor acessar o conteúdo do calendário sem conhecer a chave de compartilhamento.
Para ser vulnerável, a chave de compartilhamento do calendário deve estar ativada.

Uma vez que esse compartilhamento está ativado, um usuário pode acessar o calendário sem autenticação usando a chave de compartilhamento.

Claro, se a chave estiver errada, o acesso é negado.
A validação da chave está no arquivo "includes/header.inc"
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)==0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
A função strcmp é usada com uma comparação não estrita. O resultado dessa comparação depende do seguinte: Tabelas de comparação de tipos do PHP
O resultado da função strcmp é descrito na documentação: strcmp
Retorna < 0 se str1 for menor que str2; > 0 se str1 for maior que str2, e 0 se forem iguais.
Esta função retorna "NULL" se um dos parâmetros for um array.
Seguindo as Tabelas de comparação de tipos do PHP, a comparação não estrita entre "NULL" e 0 é true
Assim, se $_GET['cle'] for um array, o resultado da condição é true e o acesso é autorizado.
Este link definirá $_GET['cle'] como um array: https://demo.soplanning.org/planning.php?public=1&cle[]=

O acesso é concedido como "Invité"
Para corrigir esta vulnerabilidade, pode ser usada uma comparação estrita:
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)===0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
Ou a comparação pode ser feita sem a função strcmp.
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if ($_GET['cle'] === CONFIG_SECURE_KEY)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}