
El sistema de clave de uso compartido es vulnerable al ataque de PHP Type Juggling, lo que permite a un atacante acceder al contenido del calendario sin conocer la clave de uso compartido.
Para ser vulnerable, la clave de uso compartido del calendario debe estar habilitada.

Una vez que este uso compartido está habilitado, un usuario puede acceder al calendario sin autenticación mediante la clave de uso compartido.

Por supuesto, si la clave es incorrecta, se deniega el acceso.
La validación de la clave se encuentra en el archivo "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 función strcmp se utiliza con una comparación no estricta. El resultado de esta comparación depende de lo siguiente: Tablas de comparación de tipos de PHP
El resultado de la función strcmp se describe en la documentación: [strcmp]'https://www.php.net/manual/en/function.strcmp.php)
Devuelve < 0 si str1 es menor que str2; > 0 si str1 es mayor que str2, y 0 si son iguales.
Esta función devuelve "NULL" si uno de los parámetros es un array.
Según las Tablas de comparación de tipos de PHP, la comparación no estricta entre "NULL" y 0 es true.
Por lo tanto, si $_GET['cle'] es un array, el resultado de la condición es true y el acceso está autorizado.
Este enlace define $_GET['cle'] como un array: https://demo.soplanning.org/planning.php?public=1&cle[]=

El acceso se concede como "Invitado"
Para corregir esta vulnerabilidad, se puede utilizar una comparación estricta:
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';
}
}
O la comparación se puede realizar sin la función 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';
}
}