
Exploit proof-of-concept per CVE-2020-25867 che dimostra il bypass del type juggling di PHP dell'autenticazione della chiave di condivisione del calendario di SoPlanning.
Il sistema della chiave di condivisione è vulnerabile a un attacco di PHP Type Juggling, che consente a un utente malintenzionato di accedere al contenuto del calendario senza conoscere la chiave di condivisione.
Per essere vulnerabile, la chiave di condivisione del calendario deve essere abilitata.

Una volta abilitata questa condivisione, un utente può accedere al calendario senza autenticazione utilizzando la chiave di condivisione.

Ovviamente, se la chiave è falsa, l'accesso è negato.
La convalida della chiave è nel file "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';
}
}
La funzione strcmp viene utilizzata con un confronto non rigoroso. Il risultato di questo confronto dipende da quanto segue: PHP type comparison tables
Il risultato della funzione strcmp è descritto nella documentazione: [strcmp]'https://www.php.net/manual/en/function.strcmp.php)
Restituisce < 0 se str1 è minore di str2; > 0 se str1 è maggiore di str2, e 0 se sono uguali.
Questa funzione restituisce "NULL" se uno dei parametri è un array.
Seguendo le PHP type comparison tables, il confronto non rigoroso tra "NULL" e 0 è true
Pertanto, se $_GET['cle'] è un array, il risultato della condizione è true e l'accesso è autorizzato.
Questo link definirà $_GET['cle'] come un array: https://demo.soplanning.org/planning.php?public=1&cle[]=

L'accesso è concesso come "Invité"
Per correggere questa vulnerabilità, è possibile utilizzare un confronto rigoroso:
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';
}
}
Oppure il confronto può essere effettuato senza la funzione 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';
}
}